pat 甲1127. ZigZagging on a Tree (已知后序及中序建树,并层次往返输出)
2017-03-05 18:01
435 查看
1127. ZigZagging on a Tree (30)
时间限制400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue
Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree can be determined by a given pair of postorder and inorder traversal sequences. And it is a simple standard routine to print the numbers in level-order. However,
if you think the problem is too simple, then you are too naive. This time you are supposed to print the numbers in "zigzagging order" -- that is, starting from the root, print the numbers level-by-level, alternating between left to right and right to left.
For example, for the following tree you must output: 1 11 5 8 17 12 20 15.
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 inorder sequence and the third line gives the postorder sequence. All the numbers
in a line are separated by a space.
Output Specification:
For each test case, print the zigzagging sequence of the tree in a line. 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:
8 12 11 20 17 1 15 8 5 12 20 17 11 15 8 5 1
Sample Output:
1 11 5 8 17 12 20 15
#include<iostream> #include<queue> #include<vector> using namespace std; int n,rt,maxn;//节点数量,根,树的最大深度 int in[55],post[55]; int t[35][2]; vector<int>ans[55];//存放每一层的结点信息 void dfs(int &x,int l,int r,int ll,int rr) { if(l>r)return; x=rr;//存放的是下标 for(int i=l;i<=r;i++) { if(in[i]==post[rr]) { dfs(t[x][0],l,i-1,ll,ll+i-1-l); dfs(t[x][1],i+1,r,ll+i-l,rr-1); } } } struct node{ int index,depth; }; void bfs() { queue<node>q; q.push(node{rt,0}); while(!q.empty()) { node tt=q.front();q.pop(); maxn=max(maxn,tt.depth); ans[tt.depth].push_back(tt.index); if(t[tt.index][0])q.push({t[tt.index][0],tt.depth+1}); if(t[tt.index][1])q.push({t[tt.index][1],tt.depth+1}); } } int flag; void output() { for(int deep=0;deep<=maxn;deep++) { if(deep&1) for(int i=0;i<ans[deep].size();i++){ if(!flag)cout<<post[ans[deep][i]]; else cout<<" "<<post[ans[deep][i]]; flag=1; } else for(int i=ans[deep].size()-1;i>=0;i--){ if(!flag)cout<<post[ans[deep][i]]; else cout<<" "<<post[ans[deep][i]]; flag=1; } } } int main() { cin>>n; for(int i=1;i<=n;i++)cin>>in[i]; for(int i=1;i<=n;i++)cin>>post[i]; dfs(rt,1,n,1,n);//建树 bfs();//存储每层节点 output();//按照规则输出 putchar(10); return 0; }
相关文章推荐
- PAT甲题题解-1127. ZigZagging on a Tree (30)-中序、后序建树
- PAT - 甲级 - 1127. ZigZagging on a Tree (30) ( 树的层次遍历变形 )
- pat 1127. ZigZagging on a Tree (30) 递归建树 + BFS
- PAT 1127. ZigZagging on a Tree (30) 建树+双端队列 随后再看
- PAT 1127. ZigZagging on a Tree (30)-甲级
- 1127. ZigZagging on a Tree (30) PAT 甲级
- PAT甲级1127 - ZigZagging on a Tree
- PAT-1127. ZigZagging on a Tree (30)
- PAT (Advanced Level) Practise 1127 ZigZagging on a Tree (30)
- PAT 1127. ZigZagging on a Tree (30)
- PAT (Advanced Level) Practise 1127 ZigZagging on a Tree (30)
- PAT--1127. ZigZagging on a Tree
- 【PAT】【Advanced Level】1127. ZigZagging on a Tree (30)
- PAT_A 1127. ZigZagging on a Tree (30)
- PAT甲级 1127. ZigZagging on a Tree (30)
- PAT (Advanced Level)1127. ZigZagging on a Tree (30)
- PAT 甲级 1127. ZigZagging on a Tree (30)
- PAT 1127. ZigZagging on a Tree (30) 树的构建+特殊遍历序列
- 1127. ZigZagging on a Tree (30) 根据中+后输出层序遍历
- pat 1127. ZigZagging on a Tree