先序遍历和中序遍历的结点存于A[1…n]和B[1…n]中,依此编写算法建立二叉链表。即根据先序遍历和中序遍历得到二叉树的计算实现方式。
算法思想:
1)根据先序序列确定树的根节点
2)在中序序列中根据跟结点划分左右子树
3)递归实现步骤
代码如下:
BiTree PreInCreat(ElemType A[],ElemType B[],int l1,int h1,int h1,int h2{
//l1 h1,分别为先序序列的第一和最后一个结点的下标
//l2 h2,分别为中序序列的第一和最后一个结点的下标
BiTree root=(BiTree)malloc(sizeof(BiTNode);//建立根节点
root->data=A[l1];//该层跟结点赋值
for(int i=l2;B[i]!=root->data;i++);//得到跟结点在中序序列中的划分
llen=i-l2; //左子树长度
rlen=h2-i; //右子树长度
if(llen) //递归建立左子树
root->lchild=PreInCreat(A,B,l1+1,l1+llen,l2,l2+llen-1);
/** 参数分析:
l1+1:先序遍历,往前加1,是该子树的根节点
l1+len: 应该是l1+1+len-1, 抵消后为l1+len
l2:中序遍历顺序为左根右,故为l2
l2+llen-1:此为第一次划分后,根节点左子树的范围
**/
else
root->lchild=NULL;
if(rlen)
root->rchild=PreInCreat(A,B,h1-rrlen+1,h1,h2-rrlen+1,h2);
//该层参数分析类似,既然是遍历右子树,找到从中间结点的下一个到尾部即可。
else
root->rchild=NULL;
return root;//返回根节点指针
}