PAT 1020. Tree Traversals (25)

http://www.patest.cn/contests/pat-a-practise/1020

根据后序遍历和中序遍历求层序遍历

 1 #include<cstdio>
 2 #include<queue>
 3 #include<cstring>
 4 
 5 using namespace std;
 6 
 7 const int MAXN = 100;
 8 int root;
 9 int lch[MAXN], rch[MAXN];
10 vector<int> ans;
11 
12 void level_order() {
13     queue<int> q;
14     q.push(root);
15     while (!q.empty()) {
16         int r = q.front();
17         q.pop();
18         ans.push_back(r);
19         if (lch[r]) q.push(lch[r]);
20         if (rch[r]) q.push(rch[r]);
21     }
22 }
23 
24 int in_order[MAXN], post_order[MAXN];
25 
26 int build(int l1, int r1, int l2, int r2) {
27     if (l1 > r1) return 0;
28     int r = post_order[r2];
29     int p = l1;
30     while (in_order[p] != r) ++p;
31     int lcnt = p - l1;
32     lch[r] = build(l1, p - 1, l2, l2 + lcnt - 1);
33     rch[r] = build(p + 1, r1, l2 + lcnt, r2 - 1);
34     return r;
35 }
36 
37 void clear_tree() {
38     root = 0;
39     memset(lch, 0, sizeof(lch));
40     memset(rch, 0, sizeof(rch));
41 }
42 
43 int main() {
44     //freopen("input", "r", stdin);
45     int n;
46     scanf("%d", &n);
47     for (int i = 0; i < n; ++i) {
48         scanf("%d", &post_order[i]);
49     }
50     for (int i = 0; i < n; ++i) {
51         scanf("%d", &in_order[i]);
52     }
53     root = build(0, n - 1, 0, n - 1);
54     level_order();
55     vector<int>::size_type iter = 0;
56     printf("%d", ans[iter]);
57     for (++iter; iter < n; ++iter) {
58         printf(" %d", ans[iter]);
59     }
60     puts("");
61     return 0;
62 }

 

posted @ 2015-08-04 23:19  ACSeed  Views(223)  Comments(0)    收藏  举报