二叉树广义表的算法生成 (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; }