假设已知先序序列为pre1、pre2、······pren,中序序列为in1、in2、······inn,如图所示:
解题思路:根据先序序列和中序序列找到根节点,根据根节点划分左子树和右子树的数目,然后再次递归进行创建左子树与右子树的结点。(不管是左子树还是右子树都遵循遍历的原则)
代码实现
//先序序列区间Wie[preL,preR],中序序列区间为[inL,inR]
node* create(int preL,int preR,int inL,int inR)
{
if(preL>preR)
{
return NULL;//先序序列长度小于等于0时,直接返回
}
node* root=new node;//新建一个结点,用来存放当前二叉树的根节点
root->data=pre[preL];//新建结点的数据域为根节点的值
int k;
for(k=inL;k<=inR;k++)
{
if(pre[preL]== in[k])//在中序序列中找到in[k]==pre[preL]
{
break;
}
}
int numLeft=k-inL;//左子树的结点个数
//左子树的先序序列区间为[preL+1,preL+numLeft],中序序列区间为[inL,k-1]
//返回左子树的根节点地址,赋值给root的左指针
root->lchild==create(preL+1,preL+numLeft,inL,k-1);
//右子树的先序序列区间为[preL+numLeft+1,preR],中序序列区间为[k+1,inR]
//返回右子树的根节点地址,赋值给root的右指针
root->rchild==create(preL+numLeft+1,preR,k+1,inR);
return root;//返回根节点地址
}