二叉树广义表的算法生成 (A(B(,D(E,F)),C))
#include <stdio.h>
#include <stdlib.h>
typedef char DataType;
typedef struct node
{
DataType data;
struct node* lchild, * rchild;
} BinTNode;
typedef BinTNode* BinTree;
void printfNode(BinTNode* b)
{
printf("%c\n", b->data);
}
BinTNode* CreateTree(char* str)
{
BinTNode* st[100]; //用指针数组模拟栈
BinTNode* p = NULL;
int top, k, j = 0; //k 标记 1:表示下一个读取的内容是左节点 2 表示右节点 top标记双亲节点
top = -1; //置空栈
char ch = str[j]; //存放广义表的字符串数组
BinTNode* b = NULL; // b 为null 代表根节点, b isnot null
while (ch != '\0')
{
switch (ch) {
case '(':
{
// 左括号表示新的子树的开始,所以刚建立的节点指针入栈
top++;
st[top] = p;
if (p != NULL) {
printf("第(%d)位:", top);
printf("%c\n", p->data);
}
k = 1;
break;
}
case ')':
{
// 右括号表示一个子树的结束,栈顶元素没有子树,出栈
top--;
break;
}
case ',':
{
k = 2;
break;
}
default:
{
p = (BinTNode*)malloc(sizeof(BinTNode)); //申请内存
p->data = ch; //先把数据域填上
p->lchild = p->rchild = NULL;
if (b == NULL)
{
b = p;
}
else
{
switch (k)
{
case 1:
{
st[top]->lchild = p;
//printf("%s", p->data);
printf("第(%d)位的左分支:%c\n", top, p->data);
break;
}
case 2:
{
st[top]->rchild = p;
printf("第(%d)位的右分支:%c\n", top, p->data);
break;
}
}
}
}
}
j++;
ch = str[j];
}
return b;
}
void main(){
BinTNode* n = CreateTree("(A(B(,D(E,F)),C))");
printf("Hello World!\n");
return 0;
}


浙公网安备 33010602011771号