1020. Tree Traversals
Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and inorder traversal sequences, you are supposed to output the level order traversal sequence of the corresponding binary tree.
Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N (<=30), the total number of nodes in the binary tree. The second line gives the postorder sequence and the third line gives the inorder sequence. All the numbers in a line are separated by a space.
Output Specification:
For each test case, print in one line the level order traversal sequence of the corresponding binary tree. All the numbers in a line must be separated by exactly one space, and there must be no extra space at the end of the line.
Sample Input:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
Sample Output:
4 1 6 3 5 7 2
本题考查树的遍历, 给出后根遍历和中根遍历,可以确定一棵树, 最后使用层次遍历获取LevelOrder,思路如下:
直接上例子, 题目给出后根遍历2 3 1 5 7 6 4, 中根遍历1 2 3 4 5 6 7
后跟遍历可知, 4是整棵树的跟, 再看中跟遍历中4的位置,把整棵树分成1,2,3组成的左子树和5,6, 7组成的右子树, 同理, 后根遍历中也会分成2,3,1 和5,7,6两颗子树, 此时,后根2,3,1对应中根1 2 3, 后根5,7,6对应中跟5,6,7可继续递归求解,但是要注意判断特殊情况:
- 确定根后, 发现根在中根遍历的最右边,那么此书右子树为空
- 确定根后, 发现根在中根遍历的最左边,那么此书左子树为空
#include <iostream>
#include <queue>
using namespace std;
typedef struct
{
int value;
int left;
int right;
} Node;
Node node[32];
int postOrder[32];//后跟遍历
int midOrder[32];//中跟遍历
int N;
//递归函数, l1,r1表示后跟遍历的左界和右界
//l2, r2表示中根遍历的左界和右界
void f(int l1, int r1, int l2, int r2)
{
int root = postOrder[r1];
if(l1 == r1)
{
node[root].left = node[root].right = -1;
return;
}
//i记录根在midOrder的位置
int i = 0;
while(midOrder[i] != root) i++;
int cntL = i - l2; //cntL表示i左边有几个元素,用于分隔postOrder
if(i == l2)//左子树为空情况
{
node[root].left = -1;
node[root].right = postOrder[r1 - 1];
f(l1 + cntL, r1 - 1, i + 1, r2);
return;
}
if(i == r2)//右子树为空情况
{
node[root].right = -1;
node[root].left = postOrder[r1 - 1];
f(l1, l1 + cntL - 1, l2, i - 1);
return;
}
//两边都不为空,先求解两根
f(l1, l1 + cntL - 1, l2, i - 1);
f(l1 + cntL, r1 - 1, i + 1, r2);
//最后给根赋值
node[root].left = postOrder[l1 + cntL - 1];
node[root].right = postOrder[r1 - 1];
}
//层次遍历
void bfs()
{
int root = postOrder[N - 1];
queue<int> q;
q.push(root);
int first = 1;
while(!q.empty())
{
int v = q.front();
if(first)
{
first = 0;
cout << v;
}
else
{
cout << " " << v;
}
q.pop();
if(node[v].left != -1)
q.push(node[v].left);
if(node[v].right != -1)
q.push(node[v].right);
}
}
int main()
{
cin >> N;
for(int i = 0; i < N; i++)
{
cin >> postOrder[i];
}
for(int i = 0; i < N; i++)
{
cin >> midOrder[i];
}
f(0, N - 1, 0, N - 1);
bfs();
return 0;
}
1020. Tree Traversals的更多相关文章
- 【PAT】1020 Tree Traversals (25)(25 分)
1020 Tree Traversals (25)(25 分) Suppose that all the keys in a binary tree are distinct positive int ...
- PAT 1020 Tree Traversals[二叉树遍历]
1020 Tree Traversals (25)(25 分) Suppose that all the keys in a binary tree are distinct positive int ...
- PAT 甲级 1020 Tree Traversals (二叉树遍历)
1020. Tree Traversals (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Suppo ...
- PAT 1020. Tree Traversals
PAT 1020. Tree Traversals Suppose that all the keys in a binary tree are distinct positive integers. ...
- PAT 甲级 1020 Tree Traversals (25分)(后序中序链表建树,求层序)***重点复习
1020 Tree Traversals (25分) Suppose that all the keys in a binary tree are distinct positive intege ...
- PAT 甲级 1020 Tree Traversals (25 分)(二叉树已知后序和中序建树求层序)
1020 Tree Traversals (25 分) Suppose that all the keys in a binary tree are distinct positive integ ...
- PAT Advanced 1020 Tree Traversals (25 分)
1020 Tree Traversals (25 分) Suppose that all the keys in a binary tree are distinct positive integ ...
- 1020 Tree Traversals——PAT甲级真题
1020 Tree Traversals Suppose that all the keys in a binary tree are distinct positive integers. Give ...
- PTA (Advanced Level) 1020 Tree Traversals
Tree Traversals Suppose that all the keys in a binary tree are distinct positive integers. Given the ...
- 1020. Tree Traversals (25)
the problem is from pat,which website is http://pat.zju.edu.cn/contests/pat-a-practise/1020 and the ...
随机推荐
- redhat linux enterprise 5 输入ifconfig无效的解决方法
redhat linux enterprise 5 输入ifconfig无效的解决方法 在安装完成linux后,进入终端,输入命令行ifconfig,会提示bash: ifconfig: comm ...
- C# 字符串比较大小 string.Compare()方法
string.Compare方法,用来比较2个字符串值得大小 string.Compare(str1, str2, true); 返回值: 1 : str1大于str2 0 : str1等于str2 ...
- 浅谈Linux下如何修改IP
linux 下命令之浅谈//cd .. //返回上一级//创建文件夹touch test.txt//Linux不区分大小写//往一个文件中追加内容echo "****" > ...
- maven lean install 的时候出错 Failed to clean project
问题解决1 : 这种情况是属于 本地有多个 java 线程,关掉其中不用的,或者 都关闭就可以了. 问题解决 2 : Caused by: org.springframework.beans.f ...
- 2017年的golang、python、php、c++、c、java、Nodejs性能对比(golang python php c++ java Nodejs Performance)
2017年的golang.python.php.c++.c.java.Nodejs性能对比 本人在PHP/C++/Go/Py时,突发奇想,想把最近主流的编程语言性能作个简单的比较, 至于怎么比,还是不 ...
- oracle查看用户所占用的表空间
select * from (select owner || '.' || tablespace_name name, sum(b) g from (select owner, t.segment_n ...
- Single Number leetcode
Given an array of integers, every element appears twice except for one. Find that single one. Note:Y ...
- Sort List leetcode
这个题一开始本想用快速排序的,但是想了20分钟都没有头绪,难点在于快速排序的随机访问无法用链表实现,不过如果可以实现快速排序partition函数就可以了,但是这可能比较复杂,于是改用其他排序方法,上 ...
- LBPL--基于Asp.net、 quartz.net 快速开发定时服务的插件化项目
LBPL 这一个基于Asp.net. quartz.net 快速开发定时服务的插件化项目 由于在实际项目开发中需要做定时服务的操作,大体上可以理解为:需要动态化监控定时任务的调度系统. 为了实现快速开 ...
- oracle 实例启动报错(ORA-01078: failure in processing system parameters )
在启动Oracle数据库时报错,如下: [oracle@localhost ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.1.0 Productio ...