PAT 甲级 1127 ZigZagging on a Tree
https://pintia.cn/problem-sets/994805342720868352/problems/994805349394006016
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 <bits/stdc++.h> using namespace std; int N, root; vector<int> in, post; vector<int> ans[35]; int tree[35][2]; struct Node{ int index; int depth; }; void dfs(int &index, int ileft, int iright, int pleft, int pright) { if(ileft > iright) return ; index = pright; int i = 0; while(in[i] != post[pright]) i ++; dfs(tree[index][0], ileft, i - 1, pleft, pleft + i - ileft - 1); dfs(tree[index][1], i + 1, iright, pleft + i - ileft, pright - 1); } void bfs() { queue<Node> q; q.push(Node{root, 0}); while(!q.empty()) { Node temp = q.front(); q.pop(); ans[temp.depth].push_back(post[temp.index]); if(tree[temp.index][0]) q.push(Node{tree[temp.index][0], temp.depth + 1}); if(tree[temp.index][1]) q.push(Node{tree[temp.index][1], temp.depth + 1}); } } int main() { scanf("%d", &N); in.resize(N + 1), post.resize(N + 1); for(int i = 1; i <= N; i ++) scanf("%d", &in[i]); for(int i = 1; i <= N; i ++) scanf("%d", &post[i]); dfs(root, 1, N, 1, N); bfs(); printf("%d", ans[0][0]); for(int i = 1; i < 35; i ++) { if(i % 2) { for(int j = 0; j < ans[i].size(); j ++) printf(" %d", ans[i][j]); } else { for(int j = ans[i].size() - 1; j >= 0; j --) printf(" %d", ans[i][j]); } } return 0; }
可能敲了一万遍才敲对吧 今天是被 Tizzy T 洗脑的一天