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 }

浙公网安备 33010602011771号