【二叉树】 给出二叉树的中序遍历 和先序遍历或后序遍历 确定二叉树

讨论的内容如题

分析

拿中序遍历和后序遍历的组合举例子
设数组last[]储存后续遍历 in[]中序遍历,它们的长度都是n(数组从1开始计,下标范围是1-n)

树根自然为last[n] ,这时我们遍历in[]数组,在in[]数组中找到last[n]的值的下标idx,因为in[]储存的是中序遍历,显然我们以idx为界把in数组的序列分成两份[1,idx-1],[idx+1,n],分别为两颗子树上的节点。

之后我们便可以在分出的两个区间之中重复上述操作,分别找目前子树的根节点,再二分区间,直到获得完整的二叉树

可以使用递归来完成 函数(区间左,区间右,根节点,偏移量)

此时注意一个问题:当区间被二分之后,我们发现后面的区间在in[]数组和last[]数组中的下标“对不齐”了,即下标发生了偏移,如下图。所以要引入一个变量shift来记录偏移量。(偏移量最开始是0,递归时前面的区间继承原偏移量,后面的区间偏移量为原偏移量+1)
在这里插入图片描述
(在前序遍历和中序遍历的组合中,下标发生偏移的是前面的区间)

例题 后序遍历和中序遍历的组合

https://vjudge.net/contest/386054#problem/E

#include <iostream>
#include <cstring>
#include <cstdio>
struct Node
{
   
    int l,r;
};
Node treeN[10010];
int inorder[10010],postorder[10010];
int len,rt,least,lstPos;
int input()//返回数组长度
{
   
    int n,idx=1;
    char ch;
    while(scanf("%d",&n)!=EOF)
    {
   
        inorder[idx++]=n;
        ch=getchar();
        if(ch=='\n')
            break;
    }
    idx=1;
    while(scanf("%d",&n)!=EOF)
    {
   
        postorder[idx++]=n;
        ch=getchar();
        if(ch=='\n')
            break;
    }
    return idx-1;
}
int makeTree(int l,int r,int root,int n
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值