PTA L2-006 树的遍历-二叉树的后序遍历+中序遍历,输出层序遍历 团体程序设计天梯赛-练习集
2024-10-19 15:27:57
L2-006 树的遍历(25 分)
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(≤),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
输出样例:
4 1 6 3 5 7 2
二叉树:
前(先)序遍历:根左右
中序遍历:左根右
后序遍历:左右根(最后一个为根节点)
层序遍历:BFS从上到下,从左到右
前三个可以通过递归实现,最后一个BFS。
传送门:
代码:
//L2-006 树的遍历-二叉树的后序遍历、中序遍历、层序遍历
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+; struct node{
int l,r;
}tree[maxn]; int beh[maxn],mid[maxn]; int build(int la,int ra,int lb,int rb)//la,ra为中序遍历的, lb,rb为后序遍历的
{
if(la>ra) return ;
int rt=beh[rb];//根节点为后序遍历的最后一个
int p1=la;
while(mid[p1]!=rt) p1++;//找到根节点的位置下标
int p2=p1-la;
tree[rt].l=build(la,p1-,lb,lb+p2-);//递归建左子树
tree[rt].r=build(p1+,ra,lb+p2,rb-);//递归建右子树
// cout<<rt<<endl;
return rt;//返回值为结束的根节点值
} void bfs(int x)//bfs求得层序遍历
{
vector<int> vec;
queue<int> que;
que.push(x);
while(!que.empty()){
int ret=que.front();
que.pop();
if(ret==) break;
vec.push_back(ret);
if(tree[ret].l!=){//左子树不为空
que.push(tree[ret].l);
}
if(tree[ret].r!=){//右子树不为空
que.push(tree[ret].r);
}
}
int l=vec.size();
for(int i=;i<l-;i++)
cout<<vec[i]<<" ";
cout<<vec[l-]<<endl;
} int main()
{
int n;
cin>>n;
for(int i=;i<=n;i++)
cin>>beh[i];
for(int i=;i<=n;i++)
cin>>mid[i];
build(,n,,n);//建树
bfs(beh[n]);
}
最新文章
- 数据库_MYSQL
- 你的指纹还安全吗? - BlackHat 2015 黑帽大会总结 day 2
- “CEPH浅析”系列之八——小结
- Map的基本用法(Java)
- sort DEMO
- Python 学习笔记 - 10.类(Class) 1
- iOS-CALayer实现简单进度条
- MyEclipse10 Tomcat7 JDK1.7 配置
- iOS设备per app vpn,什么是什么系统的要求,必须?
- 【BZOJ4237】稻草人(CDQ分治,单调栈)
- C#线程安全使用(五)
- 深入浅出RxJava(三:响应式的好处)
- python 将字节写入文本文件
- 《剑指offer》(第二版)Java实现
- Python防止sql注入
- The method getServletContext() is undefined for the type HttpServletRequest
- Spark之Scala学习
- vmvare安装系统提示vmci.sys 版本不正确解决方法
- intelliij jdea 的file没有setting的解决方法
- input输入框外联式样式控制不了字体