1127 ZigZagging on a Tree(后序+中序=二叉树,总是忘记返回root)

 大致题意就是给出一棵树的后序、中序遍历序列,然后建一棵树,,以蛇皮走位(奇层逆序,偶层顺序)输出其层序遍历序列。

 1 #include<iostream>
 2 #include<vector>
 3 #include<queue>
 4 #include<map>
 5 using namespace std;
 6 
 7 const int maxn = 31;
 8 struct Node {
 9     int data,level;
10     Node* lchild;
11     Node* rchild;
12 };
13 int in[maxn],pos[maxn];
14 map<int,vector<int>> mp;
15 Node* create(int posL,int posR,int inL,int inR) {
16     if(inL > inR) return NULL;
17     Node* node = new Node;
18     node->data = pos[posR];
19     int k = inL,leftNum;
20     while(in[k] != pos[posR]) k++;
21     leftNum = k-inL;
22     node->lchild = create(posL,posL+leftNum-1,inL,k-1);
23     node->rchild = create(posL+leftNum,posR-1,k+1,inR);
24     return node;//总是忘记这个小可爱 
25 }
26 
27 void BFS(Node* root) {
28     queue<Node*> q;
29     root->level = 0;
30     q.push(root);
31     while(!q.empty()) {
32         Node* node = q.front();
33         mp[node->level].push_back(node->data);
34         q.pop();
35         if(node->lchild != NULL) {
36             node->lchild->level = node->level+1;
37             q.push(node->lchild);
38         }
39         if(node->rchild != NULL) {
40             node->rchild->level = node->level+1;
41             q.push(node->rchild);
42         }
43     }
44 }
45 int main() {
46     int n,flag = 0;
47     cin>>n;
48     for(int i = 0; i < n; ++i) cin>>in[i];
49     for(int i = 0; i < n; ++i) cin>>pos[i];
50     Node* root = create(0,n-1,0,n-1);
51     BFS(root);
52     for(auto it:mp) {
53         if(flag == 0) printf("%d",it.second[0]);
54         else if(flag % 2 == 1) {
55             for(int i = 0; i < it.second.size(); ++i)  printf(" %d",it.second[i]);
56         } else {
57             for(int i = it.second.size()-1; i >= 0; --i)  printf(" %d",it.second[i]);
58         }
59         flag++;
60     }
61     return 0;
62 }

猜你喜欢

转载自www.cnblogs.com/keep23456/p/12519464.html