浏览器标题切换
浏览器标题切换end

PTA1020 - Tree Traversals - 根据后序中序求层序遍历模板题

题意

给出n个点的后序和中序,让我们输出层序遍历顺序,末尾没有空格。

根据样例给出的后序和中序,所构建的二叉树如图所示:

undefined

所以容易得知,层序遍历为:4 1 6 3 5 7 2

思路

模板题。通过map将前序遍历的id与层序遍历的level相对应。

注意

  1. 如果题目问的是求前序,那么id就不用记录了

  2. vector post,in; 可以写成 int post[40],in[40]; ,这样main函数里面就不用resize了

  3. 但是我不太明白的一点就是为什么vector定义之后不resize就会错误??!

AC代码

#include<iostream>
#include<string>
#include<stdio.h>
#include<algorithm>
#include<map>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f

vector<int> post,in; // 后序 中序
map<int,int> level;

void pre(int root,int s,int e,int id)
{
    if(s>e) return;
    int i=s;
    while(i<e&&in[i]!=post[root]) i++; // 让i在中序中找到根结点
    level[id]=post[root];
    //cout<<"**"<<post[root]<<"**"; // 如果已知后序中序求前序的话,就在这边输出前序就好了
    pre(root-(e-i+1),s,i-1,2*id+1);
    // 左子树在后序中的根结点=当前根结点-(右子树的个数+1)
    pre(root-1,i+1,e,2*id+2);
    // 右子树的根结点=当前根结点的前一个结点
}

int main()
{
    int n;
    cin>>n;
    post.resize(n),in.resize(n);
    for(int i=0;i<n;i++)
        cin>>post[i];
    for(int i=0;i<n;i++)
        cin>>in[i];
    pre(n-1,0,n-1,0);

    auto it=level.begin();
    cout<<it->second;
    while(++it!=level.end())
        cout<<" "<<it->second;

// 如果没有格式要求的话,可以这样写
//    for(auto&it:level) // 输出
//        cout<<it.second<<" ";
//    cout<<endl;
    return 0;
}
posted @   抓水母的派大星  阅读(69)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
历史上的今天:
2020-03-06 寒假Day43:HDU1540 - Tunnel Warfare - 线段树+区间合并
2020-03-06 寒假Day42:JAVA-OOP-java核心类
点击右上角即可分享
微信分享提示