PAT-1020 Tree Traversals

传送门

题意

根据中序遍历和后序遍历,输出层次遍历。

思路

后序遍历的最后一个结点是根结点,在中序遍历中找到该结点,在该结点左边的则是左子树,右边的则是右子树。此时问题就变成了左右子树两个子问题。所以该题用递归写即可。

代码

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<vector>
 4 #include<queue>
 5 using namespace std;
 6 
 7 int postorder[35], inorder[35];
 8 vector<int> g[35];
 9 
10 void build(int u, int idx, int left, int right){   //u是父亲结点, idx是后序遍历的第idx结点,left和right是子树的结点范围
11     if(left > right)    return;
12     for(int i=left; i<=right; i++){   //找到当前子树的根结点
13         if(inorder[i] == postorder[idx]){
14             g[u].push_back(inorder[i]);
15             build(postorder[idx], idx-1, left, i-1);  //递归左子树
16             build(postorder[idx], idx-1, i+1, right); //递归右子树
17             return;
18         }
19     }
20     build(u, idx-1, left, right);    //如果没有找到,那么找后序遍历的下一个结点
21 }
22 
23 
24 int main(){
25     //freopen("in.txt", "r", stdin);
26     int n; scanf("%d", &n);
27     for(int i=1; i<=n; i++)  scanf("%d", &postorder[i]);
28     for(int i=1; i<=n; i++)  scanf("%d", &inorder[i]);
29     int pos;
30     for(int i=1;i<=n;i++){  //找到根结点
31         if(inorder[i] == postorder[n]){
32             pos = i;
33             break;
34         }
35     }
36     build(postorder[n], n-1, 1, pos-1);   //递归左子树
37     build(postorder[n], n-1, pos+1, n);   //递归右子树
38     queue<int> q;
39     q.push(postorder[n]);
40     while(!q.empty()){   //层次遍历输出
41         int s = q.front();
42         q.pop();
43         for(int i=0; i<g[s].size(); i++){
44             q.push(g[s][i]);
45         }
46         printf("%d", s);
47         if(!q.empty())  printf(" ");
48     }
49     printf("
");
50     return 0;
51 }
原文地址:https://www.cnblogs.com/zyb993963526/p/12525479.html