#include"tree01.cpp"
#define MaxWidth 40
//由遍历序列构造二叉树
//由先序和中序遍历序列构造二叉树
BTNode *CreateBT1(char *pre,char *in,int n){ //先序字符串,中序字符串,结点个数
BTNode *b;
char *p;
int k;
if(n<=0) //结点个数小于0
return NULL;
b = (BTNode *)malloc(sizeof(BTNode)); //为结点分配空间
b->data = *pre; //先序遍历的首字符为根结点
for(p = in;p<in+n;p++) //将in字符串首地址赋值给p,因为in是连续的字符串,所以p++就是向后遍历in字符串
if(*p == *pre) //*p取的是p指针所指向的地址的值
break; //在in中找到根结点后,退出循环
k = p-in; //确定根结点在in中的位置
b->lchild = CreateBT1(pre+1,in,k); //递归构造左子树
b->rchild = CreateBT1(pre+k+1,p+1,n-k-1); //递归构造右子树 p+1是in根结点后面的结点
return b;
}
//由中序和后序遍历序列构造二叉树
BTNode *CreateBT2(char *post,char *in,int n){ //后序序列、中序序列
BTNode *b;
char r,*p;
int k ;
if(n<=0)
return NULL;
r = *(post+n-1); //取根结点的值
b = (BTNode *)malloc(sizeof(BTNode));
b->data = r;
for(p = in;p<in+n;p++){
if(*p == r) break;
}
k=p-in; //k为根结点在in中的下标
b->lchild = CreateBT2(post,in,k); //递归构造左子树
b->rchild = CreateBT2(post+k,p+1,n-k-1); //递归构造右子树
return b;
}
int main(){
BTNode *b;
char pre[] = "ABDEHJKLMNCFGI";
char in[] = "DBJHLKMNEAFCGI";
char post[] = "DJLNMKHEBFIGCA";
int n = 14;
b = CreateBT1(pre,in,n);
printf("先序序列:%s\n",pre);
printf("中序序列:%s\n",in);
printf("构造一颗二叉树b:\n");
printf("输出二叉树"); DispBTree(b);printf("\n");
// printf("先序序列:%s\n",pre);
// printf("中序序列:%s\n",in);
printf("-----------中序遍历二叉树:\n");
printf("递归:");printf("\n");
Inorder(b);
b = CreateBT2(post,in,n);
printf("构造一颗二叉树b:\n");
printf("输出二叉树"); DispBTree(b);printf("\n");
DestroyBTree(b);
return 1;
}