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,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 洗脑的一天 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |