根据括号次序创建二叉树,字符串如char Stra[30]="A(B(D(,G)),C(E,F))";
基本思路:
如果是非(,),则创建一个节点(对于书为空时,将其设为根节点,非空时,如果其前一个字符时(,则讲其插入前一个字符的左孩子中,如果是,,插入右孩子中。)。
对于"(",","可以忽略字符,但保留标记,以用于下一个字符的插入。")"标志着当前栈节点左右孩子都插满了,所以可将其产出。
具体代码如下(PAGES201):
#include#include const int MaxSize=40;struct BTNode{ char date; BTNode* Leftchild; BTNode* Rightchild;};void createBTNode(BTNode *&b, char *str){ BTNode *St[MaxSize];int top=-1; int j=0; b=NULL; BTNode *p=NULL; char ch=str[j]; int k=0; while(ch!='\0') { switch (ch) { case '(': top++;St[top]=p; k=1;break; case ',': k=2;break; case ')': top--;break; default: p=(BTNode*)malloc(sizeof(BTNode)); p->Leftchild=NULL;p->Rightchild=NULL;p->date=ch; if (b==NULL) { b=p; } else switch (k) { case 1: St[top]->Leftchild=p;break; case 2: St[top]->Rightchild=p;break; } } ch=str[++j]; }}void PREOrder(BTNode* T){ if (T!=NULL) { printf("%c\n",T->date); PREOrder(T->Leftchild); PREOrder(T->Rightchild); }}int main(){ char Stra[30]="A(B(D(,G)),C(E,F))"; BTNode *Root; createBTNode(Root,Stra); PREOrder(Root);}