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

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

题意

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

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

所以容易得知,层序遍历为: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 @ 2021-03-06 17:01  抓水母的派大星  阅读(69)  评论(0编辑  收藏  举报