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

本文讨论如何通过二叉树的中序遍历和后序遍历或前序遍历来确定二叉树结构。分析过程中指出,可以递归地根据中序遍历找到根节点,然后根据后序遍历或前序遍历划分子树,并处理下标偏移问题。提供相关例题链接以加深理解。

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

讨论的内容如题

分析

拿中序遍历和后序遍历的组合举例子
设数组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)
{
   
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值