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
题意:中序和后序建树,然后按zigzagging order输出。
分析:层序遍历的时候将节点输出到容器中,最后输出的时候根据奇数还是偶数来输出结点
1 /**
2 * Copyright(c)
3 * All rights reserved.
4 * Author : Mered1th
5 * Date : 2019-02-28-14.24.50
6 * Description : A1127
7 */
8 #include<cstdio>
9 #include<cstring>
10 #include<iostream>
11 #include<cmath>
12 #include<algorithm>
13 #include<string>
14 #include<unordered_set>
15 #include<map>
16 #include<vector>
17 #include<set>
18 #include<queue>
19 using namespace std;
20 const int maxn=31;
21 int n,post[maxn],in[maxn];
22 vector<int> ans[maxn];
23 struct Node{
24 int val,layer;
25 Node* lchild;
26 Node* rchild;
27 Node(int _val,int _layer){
28 val=_val;
29 lchild=NULL;
30 rchild=NULL;
31 layer=_layer;
32 }
33 };
34 int maxlayer=1;
35 Node* create(int inL,int inR,int postL,int postR,int layer){
36 if(inL>inR) return NULL;
37 if(layer>maxlayer) maxlayer=layer;
38 int rootVal=post[postR];
39 Node* root=new Node(rootVal,layer);
40 int k;
41 for(int i=inL;i<=inR;i++){
42 if(post[postR]==in[i]){
43 k=i;
44 break;
45 }
46 }
47 int numLeft=k-inL;
48 root->lchild=create(inL,k-1,postL,postL+numLeft-1,layer+1);
49 root->rchild=create(k+1,inR,postL+numLeft,postR-1,layer+1);
50 return root;
51 }
52
53 void BFS(Node* root){
54 queue<Node*> q;
55 q.push(root);
56 while(!q.empty()){
57 Node* now=q.front();
58 q.pop();
59 ans[now->layer].push_back(now->val);
60 if(now->lchild!=NULL) q.push(now->lchild);
61 if(now->rchild!=NULL) q.push(now->rchild);
62 }
63 }
64
65 int main(){
66 #ifdef ONLINE_JUDGE
67 #else
68 freopen("1.txt", "r", stdin);
69 #endif
70 scanf("%d",&n);
71 for(int i=0;i<n;i++){
72 scanf("%d",&in[i]);
73 }
74 for(int i=0;i<n;i++){
75 scanf("%d",&post[i]);
76 }
77 Node* root=create(0,n-1,0,n-1,1);
78 BFS(root);
79 for(int i=1;i<=maxlayer;i++){
80 if(i==1){
81 printf("%d",ans[i][0]);
82 continue;
83 }
84 if(i%2==0){
85 for(int j=0;j<ans[i].size();j++){
86 printf(" %d",ans[i][j]);
87 }
88 }
89 else{
90 for(int j=ans[i].size()-1;j>=0;j--){
91 printf(" %d",ans[i][j]);
92 }
93 }
94 }
95 return 0;
96 }