PTA1020 - Tree Traversals - 根据后序中序求层序遍历模板题
题意
给出n个点的后序和中序,让我们输出层序遍历顺序,末尾没有空格。
undefined
所以容易得知,层序遍历为:4 1 6 3 5 7 2
思路
模板题。通过map将前序遍历的id与层序遍历的level相对应。
注意
-
如果题目问的是求前序,那么id就不用记录了
-
vector
post,in; 可以写成 int post[40],in[40]; ,这样main函数里面就不用resize了 -
但是我不太明白的一点就是为什么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;
}
分类:
图论
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.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核心类