L2-006. 树的遍历
来源:互联网 发布:端口测试失败 编辑:程序博客网 时间:2024/05/19 10:41
L2-006. 树的遍历
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(<=30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
输出样例:
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(<=30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
输出样例:
4 1 6 3 5 7 2
思路: 给出中序和后序构建二叉树。
首先我们由后序可以确定树的根节点,之后我们再在中序中找到根节点所处的位置,可知,在根节点之前的是根节点的左子树,后面的是根节点的右之树。继而在中序中找到左子树和右子树的长度(也就是个数),再在后序中找到当前的子树的根节点,重复上面的步骤,就可以很完美的构建出二叉树了。如图:
图中红色的为二叉树各节点的位置
AC代码:
#include <iostream>#include <queue>#include <vector>#define maxn 1000using namespace std;int a[maxn], b[maxn];struct node{ int l; int r;}p[maxn];int built(int al, int ar, int bl, int br){ if(al > ar) return 0; int root, p1, p2; root = b[br]; p1 = al; while(a[p1]!=root) p1++; p2 = p1 - al; p[root].l = built(al, p1 - 1, bl, bl + p2 - 1); p[root].r = built(p1 + 1, ar, bl + p2, br - 1); return root;}void bfs(int x){ queue<int>q; vector<int>v; q.push(x); while(!q.empty()) { int n = q.front(); q.pop(); if(n==0) break; v.push_back(n); if(p[n].l!=0) q.push(p[n].l); if(p[n].r!=0) q.push(p[n].r); } int len = v.size(); for(int i = 0; i < len; i++) { if(i==len - 1) { cout << v[i] << endl; } else { cout << v[i] << " "; } } return ;}int main(){ int n; cin >> n; for(int i = 0; i < n; i++) { cin >> b[i]; ///后序 } for(int i = 0; i < n; i++) { cin >> a[i]; ///中序 } built(0, n - 1, 0, n - 1); int root = b[n - 1]; bfs(root); return 0;}
0 0
- L2-006. 树的遍历
- L2-006. 树的遍历
- L2-006. 树的遍历
- L2-006. 树的遍历
- L2-006. 树的遍历
- L2-006. 树的遍历
- L2-006. 树的遍历
- L2-006. 树的遍历
- L2-006. 树的遍历
- L2-006. 树的遍历
- L2-006. 树的遍历
- L2-006. 树的遍历
- L2-006. 树的遍历
- L2-006. 树的遍历
- L2-006. 树的遍历
- L2-006. 树的遍历
- L2-006. 树的遍历
- L2-006. 树的遍历
- Spark分析之Master
- logistic回归
- 前k小、前k大算法
- eclipse中常用的快捷键
- 使用蓝图(Blueprint)绑定多播委托(Multicast Delegate)【UE4】【C++】
- L2-006. 树的遍历
- Spark分析之Worker
- css sprites(CSS 精灵):如何获取一张集成拼合图片上的其他图片
- 编写规范化JavaScript代码的方法总结
- 面试
- 谈了这么久的Project Tango?我们终于把它讲清楚
- 机器学习之数据清理经验
- maven的介绍和安装
- Spark分析之Master、Worker以及Application三者之间如何建立连接