PAT (Advanced Level) 1127. ZigZagging on a Tree (30) 解题报告
2017-03-05 13:21
597 查看
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
思路:根据中序后序建树,然后层次输出,注意输出的顺序,题目要求Z型输出
代码:
#include <cstdio> #include <vector> #include <iostream> #include <algorithm> #include <cmath> #include <queue> using namespace std; #define MAXN 1010000 int in[MAXN], post[MAXN], l[MAXN], r[MAXN]; int build(int inl, int inr, int postl, int postr) { if(inl > inr) return 0; int rt = post[postr], p = inl, cnt; while(rt != in[p]) p++; cnt = p - inl; l[rt] = build(inl, p-1, postl, postl + cnt - 1); r[rt] = build(p+1, inr, postl + cnt, postr-1); return rt; } void print(int rt) { queue<int> Q; int level = 0; Q.push(rt); printf("%d", rt); while(!Q.empty()) { vector<int> V; while(!Q.empty()) { int now = Q.front(); Q.pop(); if(l[now]) V.push_back(l[now]); if(r[now]) V.push_back(r[now]); } for(int i = 0; i < V.size(); i++) Q.push(V[i]); if(level % 2 == 0) for(int i = 0; i < V.size(); i++) printf(" %d", V[i]); else for(int i = V.size() - 1; i >= 0; i--) printf(" %d", V[i]); level ++; } printf("\n"); } int main() { int n; scanf("%d", &n); for(int i = 0; i < n; i++) scanf("%d", &in[i]); for(int i = 0; i < n; i++) scanf("%d", &post[i]); build(0, n-1, 0, n-1); print(post[n-1]); return 0; }
相关文章推荐
- PAT (Advanced Level) 1004. Counting Leaves (30) 解题报告
- PAT (Advanced Level) 1038. Recover the Smallest Number (30) 解题报告
- PAT (Advanced Level) 1115. Counting Nodes in a BST (30) 解题报告
- PAT (Advanced Level) 1102. Invert a Binary Tree (25) 解题报告
- PAT (Advanced Level) 1103. Integer Factorization (30) 解题报告
- PAT (Advanced Level) 1003. Emergency (25) 解题报告
- PAT (Advanced Level) 1037. Magic Coupon (25) 解题报告
- PAT(Advanced Level) 1020 Tree Traversals 解题报告
- PAT (Advanced Level) 1064. Complete Binary Search Tree (30) 递归建立CBST
- PAT (Advanced Level) Practise 1099 Build A Binary Search Tree (30)
- PAT (Advanced Level) 1126. Eulerian Path (25) 解题报告
- 【PAT】【Advanced Level】1064. Complete Binary Search Tree (30)
- 【PAT】【Advanced Level】1123. Is It a Complete AVL Tree (30)
- PAT (Advanced Level) Practise 1123 Is It a Complete AVL Tree (30)
- 【PAT】【Advanced Level】1127. ZigZagging on a Tree (30)
- PAT (Advanced Level) Practise 1123 Is It a Complete AVL Tree (30)
- PAT (Advanced Level) Practise 1127 ZigZagging on a Tree (30)
- PAT (Basic Level) Practise(中文)----30题解题报告
- PAT (Advanced Level) 1100. Mars Numbers (20) 解题报告
- 1064. Complete Binary Search Tree (30)【二叉树】——PAT (Advanced Level) Practise