二叉树序列构建
根据二叉树的前序,中序与后序序列构建二叉树
#include <stdio.h> #include <stdlib.h> #define MaxSize 100 typedef struct node /*二叉树结构定义*/ { char data; struct node *lchild,*rchild; }binnode; typedef binnode *bintree; bintree CreateBinTreebyPreIn(char *pre,char *in,int n){ bintree t; int k; char *p,r; if(n<=0){ return NULL; } r=*pre; t=(bintree)malloc(sizeof(binnode)); t->data=r; for(p=in;p<in+n;p++) if(*p==r) break; k=p-in; t->lchild=CreateBinTreebyPreIn(pre+1,in,k); t->rchild=CreateBinTreebyPreIn(pre+k+1,p+1,n-1-k); return t; } bintree CreateBinTreebyPostIn(char *in,char *post,int n){ bintree t; int k; char r,*p; if(n<=0){ return NULL; } r=*(post+n-1); t=(bintree)malloc(sizeof(binnode)); t->data=r; for(p=in;p<in+n;p++){ //在in中查找根节点 if(*p==r) break; } k=p-in;//k为根节点在in中的位置 t->lchild=CreateBinTreebyPostIn(in,post,k); t->rchild=CreateBinTreebyPostIn(p+1,post+k,n-k-1); return t; }/*由中序序列in和后序序列post构造二叉树,并返回树根结点指针,如果树为空返回NULL */ void DispBinTree(bintree t){ if (t!=NULL) { printf("%c",t->data); if (t->lchild || t->rchild) { printf("("); DispBinTree(t->lchild); if (t->rchild) printf(","); DispBinTree(t->rchild); printf(")"); } } }/* 以括号表示法输出二叉树*/ int main() { bintree T; char pre[MaxSize],in[MaxSize],post[MaxSize]; int n; scanf("%d",&n);getchar(); scanf("%s",pre); scanf("%s",in); scanf("%s",post); T=CreateBinTreebyPreIn(pre,in,n); printf("\nthe result is:"); if (T==NULL) printf("\nnull"); else DispBinTree(T); T=CreateBinTreebyPostIn(in,post,n); printf("\nthe result is:"); if (T==NULL) printf("\nnull"); else DispBinTree(T); return 0; }