由遍历序列构造二叉树
#include<iostream> #include<stdio.h> #include<malloc.h> using namespace std; #define MaxSize 100 #define MaxWidth 40 typedef char ElemType; typedef struct node { ElemType data;//数据元素 struct node *lchild;//指向左孩子 struct node *rchild;//指向右孩子 }BTNode; BTNode *CreateBT1(char *pre,char *in,int n)//由先序和中序遍历序列构造二叉树 { BTNode *s; char *p; int k; if(n<=0)return NULL; s=(BTNode *)malloc(sizeof(BTNode));//创建二叉树结点*s s->data=*pre; for(p=in;p<in+n;p++)//在中序序列中找等于*pre的位置k if(*p==*pre) break; k=p-in; s->lchild=CreateBT1(pre+1,in,k); s->rchild=CreateBT1(pre+k+1,p+1,n-k-1); return s; } BTNode *CreateBT2(char *post,char *in,int n,int m)//由中序和后序遍历序列构造二叉树 { BTNode *s; char *p,*q,*maxp; int maxpost,maxin,k; if(n<=0)return NULL; maxpost=-1; for(p=in;p<in+n;p++)//求in的全部字符中在post最右边的那个字符 for(q=post;q<post+m;q++)//在in中用maxp指向这个字符,用maxin标志它在in中的下标 if(*p==*q) { k=q-post; if(k>maxpost) { maxpost=k; maxp=p; maxin=p-in; } } s=(BTNode *)malloc(sizeof(BTNode));//创建二叉树结点*s s->data=post[maxpost]; s->lchild=CreateBT2(post,in,maxin,m); s->rchild=CreateBT2(post,maxp+1,n-maxin-1,m); return s; } void DispBTNode(BTNode *b)//以括号表示法输出二叉树 { if(b!=NULL) { printf(" %c",b->data); if(b->lchild!=NULL||b->rchild!=NULL) { printf("("); DispBTNode(b->lchild);//递归处理左子树 if(b->rchild!=NULL)printf(","); DispBTNode(b->rchild);//递归处理右子树 printf(")"); } } } void DispBTNode1(BTNode *b)//以凹入表示法输出一颗二叉树 { BTNode *St[MaxSize],*p; int level[MaxSize][2],top=-1,n,i,width=4; char type; if(b!=NULL) { top++; St[top]=b;//根结点入栈 level[top][0]=width; level[top][1]=2;//2表示是根 while(top>-1) { p=St[top];//退桟并凹入显示该结点值 n=level[top][0]; switch(level[top][1]) { case 0:type='L';break;//左结点之后输出(L) case 1:type='R';break;//右结点之后输出(R) case 2:type='B';break;//根结点之后输出(B) } for(i=1;i<=n;i++)//其中n为显示场宽,字符以右对齐显示 printf(" "); printf("%c(%c)",p->data,type); for(i=n+1;i<=MaxWidth;i+=2) printf("--"); printf("\n"); top--; if(p->rchild!=NULL) { top++;//将右子树根结点入栈 St[top]=p->rchild; level[top][0]=n+width;//显示场宽增width level[top][1]=1;//1表示是右子树 } if(p->lchild!=NULL) { top++;//将左子树根结点入栈 St[top]=p->lchild; level[top][0]=n+width;//显示场宽增width level[top][1]=0;//0表示是左子树 } } } } void main() { BTNode *b; ElemType pre[]="ABDEHJKLMNCFGI"; ElemType in[]="DBJHLKMNEAFCGI"; ElemType post[]="DJLNMKHEBFIGCA"; b=CreateBT1(pre,in,14); printf(" 先序序列:%s\n",pre); printf(" 中序序列:%s\n",in); printf(" 构造一颗二叉树b:\n"); printf(" 括号表示法:");DispBTNode(b);printf("\n"); printf(" 凹入表示法:\n");DispBTNode1(b);printf("\n\n"); printf(" 中序序列:%s\n",pre); printf(" 后序序列:%s\n",in); printf(" 构造一颗二叉树b:\n"); printf(" 括号表示法:");DispBTNode(b);printf("\n"); printf(" 凹入表示法:\n");DispBTNode1(b);printf("\n"); }