二叉树的重构(前序/后序+中序还原二叉树)

本文介绍如何利用前序+中序及后序+中序遍历序列还原二叉树的方法,并提供具体的实现代码。通过理解遍历特性,可以逐步确定每个节点的位置,进而重建整棵树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

只要知道前序/后序+中序就可以还原二叉树。

前序+中序

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 树的遍历

数组实现版本待补充

如果二叉树是真二叉树,那么前序+后序也可以还原

如下图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值