只要知道前序/后序+中序就可以还原二叉树。
前序+中序
PreOrder: GDAFEMHZ
InOrder: ADEFGHMZ
通过前序我们可以找到根节点为G,之后在中序中我们中序遍历的特性找到G的左子树ADEF和右子树MHZ。之后在通过前序找到左子树的根节点D,那么左子树的左子树为A,左子树的右子树为EF。之后发现A空树,那么在同理通过前序找到左子树的右子树的根为F,左节点为E,之后同理就可以还原一棵树了。
实现
void createtree(int *pr,int *in,int len,tree &T)
{
if(len==0){
T=NULL;
return ;
}
T=new bintree;
T->date=*pr;
int len1=0;
for(;len1<len;len1++){
if(in[len1]==*pr)
break;
}
createtree(pr+1,in,len1,T->lc); // 当前树的根节点左边的子树
createtree(pr+len1+1,in+len1+1,len-(len1+1),T->rc); // 当前树的根节点右边的子树
}
相关题目 L2-011 玩转二叉树
后序+中序
按照后序的性质最后一个为根节点,之后为右子树的根节点,和前序+中序的思路相同,就可以还原成树了
实现
void createtree(int *in,int *po,int len,tree &T)
{
if(len==0){
T=NULL;
return;
}
T=new bintree;
T->date=*po;
int len1=0;
for(;len1<len;len1++){
if(in[len1]==*po)
break;
}
createtree(in,po-(len-len1),len1,T->lc);
createtree(in+len1+1,po-1,len-len1-1,T->rc);
}
相关题目 L2-006 树的遍历
数组实现版本待补充
如果二叉树是真二叉树,那么前序+后序也可以还原
如下图