//由先序序列和中序序列构造二叉树
BTNode *CreateBT1(char *pre,char *in,int n)
{
//pre存放先序序列,in存放中序序列,n为二叉树的结点个数
//算法执行后返回构造二叉链的根结点
/********** Begin **********/
BTNode *b;
char *p;
int k;
if(n<=0)return NULL;
b=(BTNode *)malloc(sizeof(BTNode)); //创建根结点
b->data=*pre;
for(p=in;p<in+n;p++) //在中序中找等于*pre字符的位置k
{
if(*p==*pre) //pre指向根结点
{
break;
}
}
k=p-in; //确定根结点在in中的位置
b->lchild=CreateBT1(pre+1,in,k); //递归构造左子树
b->rchild=CreateBT1(pre+k+1,p+1,n-k-1); //递归构造右子树
return b;
/********** End **********/
}
//由中序序列和后序序列构造二叉树
BTNode *CreateBT2(char *post,char *in,int n)
{
//post存放后序序列,in存放中序序列,n为二叉树的结点个数
//算法执行后返回构造二叉链的根结点
/********** Begin **********/
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++) //在in中查找根结点
{
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;
/********** End **********/
}
由双遍历序列构造二叉树
于 2022-04-16 16:24:30 首次发布