1127 ZigZagging on a Tree
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
题意:
给出中序和后序遍历的结果,要求按照从右到左,从左到右依次替换的方法来输出层次遍历的结果。(Too native.)
思路:
构造数,层次遍历,遍历的过程中用双向队列来存储每一层的数据,没遍历完一层,根据要求判断所在层数是pop_front()还是pop_back()。
Code:
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 vector<int> inOrder(50); 6 vector<int> postOrder(50); 7 8 typedef struct Node* node; 9 10 struct Node { 11 int date; 12 node left; 13 node right; 14 Node(int v) { 15 date = v; 16 left = NULL; 17 right = NULL; 18 } 19 }; 20 21 node buildTree(int index, int left, int right) { 22 if (left > right) return NULL; 23 node root = new Node(postOrder[index]); 24 int pos; 25 for (int i = left; i <= right; ++i) { 26 if (inOrder[i] == postOrder[index]) { 27 pos = i; 28 break; 29 } 30 } 31 int len = right - pos; 32 root->left = buildTree(index - len - 1, left, pos - 1); 33 root->right = buildTree(index - 1, pos + 1, right); 34 return root; 35 } 36 37 void levelOrder(node root) { 38 queue<node> que; 39 deque<int> level; 40 vector<int> ans; 41 node last = new Node(-1); 42 que.push(root); 43 que.push(last); 44 bool leftToRight = false; 45 while (!que.empty()) { 46 node temp = que.front(); 47 que.pop(); 48 if (temp->date == -1) { 49 if (que.empty() && level.empty()) break; 50 que.push(last); 51 if (leftToRight) { 52 while (!level.empty()) { 53 ans.push_back(level.front()); 54 level.pop_front(); 55 } 56 leftToRight = false; 57 } else { 58 while (!level.empty()) { 59 ans.push_back(level.back()); 60 level.pop_back(); 61 } 62 leftToRight = true; 63 } 64 } else { 65 level.push_back(temp->date); 66 if (temp->left) que.push(temp->left); 67 if (temp->right) que.push(temp->right); 68 } 69 } 70 cout << ans[0]; 71 for (int i = 1; i < ans.size(); ++i) cout << " " << ans[i]; 72 cout << endl; 73 } 74 75 int main() { 76 int n; 77 cin >> n; 78 79 for (int i = 0; i < n; ++i) cin >> inOrder[i]; 80 for (int i = 0; i < n; ++i) cin >> postOrder[i]; 81 82 node root = buildTree(n - 1, 0, n - 1); 83 84 levelOrder(root); 85 86 return 0; 87 }
多看看别人的博客,看一下同一道问题的不同解,也能够让自己的思维更加的开阔。
我写的代码还是按照中规中矩的方法来解决问题,看了柳神的博客感觉它的代码更加的简练,也更加的值得我去学习。
Code:
1 #include <iostream> 2 #include <vector> 3 #include <queue> 4 using namespace std; 5 vector<int> in, post, result[35]; 6 int n, tree[35][2], root; 7 struct node { 8 int index, depth; 9 }; 10 void dfs(int &index, int inLeft, int inRight, int postLeft, int postRight) { 11 if (inLeft > inRight) return; 12 index = postRight; 13 int i = 0; 14 while (in[i] != post[postRight]) i++; 15 dfs(tree[index][0], inLeft, i - 1, postLeft, postLeft + (i - inLeft) - 1); 16 dfs(tree[index][1], i + 1, inRight, postLeft + (i - inLeft), postRight - 1); 17 } 18 void bfs() { 19 queue<node> q; 20 q.push(node{root, 0}); 21 while (!q.empty()) { 22 node temp = q.front(); 23 q.pop(); 24 result[temp.depth].push_back(post[temp.index]); 25 if (tree[temp.index][0] != 0) 26 q.push(node{tree[temp.index][0], temp.depth + 1}); 27 if (tree[temp.index][1] != 0) 28 q.push(node{tree[temp.index][1], temp.depth + 1}); 29 } 30 } 31 int main() { 32 cin >> n; 33 in.resize(n + 1), post.resize(n + 1); 34 for (int i = 1; i <= n; i++) cin >> in[i]; 35 for (int i = 1; i <= n; i++) cin >> post[i]; 36 dfs(root, 1, n, 1, n); 37 bfs(); 38 printf("%d", result[0][0]); 39 for (int i = 1; i < 35; i++) { 40 if (i % 2 == 1) { 41 for (int j = 0; j < result[i].size(); j++) 42 printf(" %d", result[i][j]); 43 } else { 44 for (int j = result[i].size() - 1; j >= 0; j--) 45 printf(" %d", result[i][j]); 46 } 47 } 48 return 0; 49 }
2020-07-07 21:29:02