算法基础实验OJ—树的遍历

树的遍历

Description

给定某二叉树的前序序列和中序序列,输出该二叉树的后序序列。(输入的前序遍历和中序遍历的结果中都不含重复的数字)

第一行是n 接下来一行有n个数表示前序序列 最后一行是中序序列 对于30%的数据,n<=20 对于60%的数据,n<=1000 对于100%的数据,n<=100000 输出树的后序序列
输入:
5 
3 9 20 15 7
9 3 15 20 7
输出:
9 15 7 20 3  注意最后一位数字后没有空格
解题思路:
因为通过一棵树的前序遍历,我们可以确定它的根结点,那么有了根结点以后,我们联系之前正常遍历一棵树:其实很简单,就是打印出当前的根结点,根据前中后的顺序,在递归中把打印动作放到适当的位置。那么现在我们有了前序和中序,其实不用构建一棵树再打印,而是通过前序遍历,可以知道根结点在哪里,然后我们去中序里面找这个根结点的位置,根据根结点的位置将中序遍历得到的序列分成左右两棵树,同理前序序列也要分成左右子树与中序的对应进行递归,再对分出的左右子树继续遍历,在两次递归后最后打印根结点,这样就得到了这棵树的后序遍历。 那么如何找这个前序中序中左右子树的位置呢?其实也很简单,随便举一个例子,找出对应的等式关系就好了!

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

有了上述关系 代码就很好写了!!
#include<bits/stdc++.h>
const int N = 1e5;
int n;
int pre[N];
int in[N];
int cnt;
void post(int pre[],int in[],int len){
        if(len<=0)
        {return;}
            
        int root = pre[0];
        int k=0;
        while(in[k]!=root)k++;
        // if(k==0){printf("%d ",root);return;}
        
        int inleft[N],preleft[N],inright[N],preright[N];
        
        for(int i=0;i<=k-1;i++)
            inleft[i]=in[i];
        for(int i=1;i<=k;i++)
            preleft[i-1]=pre[i];
        for(int i=k+1;i<=len-1;i++)
            inright[i-k-1]=in[i];
        for(int i=k+1;i<=len-1;i++)
            preright[i-k-1]=pre[i];
            
        int leftlen = k;
        int rightlen = len-k-1;
        
        post(preleft,inleft,leftlen);
        post(preright,inright,rightlen);
        if(cnt==0)
        printf("%d",root);
        else
        printf(" %d",root);
        cnt++;
    }
int main(){
        scanf("%d",&n);
    for(int i = 0;i<n;i++)
        scanf("%d",&pre[i]);
    for(int i = 0;i<n;i++)
        scanf("%d",&in[i]);

    post(pre,in,n);
    
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

之墨_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值