题意
根据中序遍历和后序遍历,输出层次遍历。
思路
后序遍历的最后一个结点是根结点,在中序遍历中找到该结点,在该结点左边的则是左子树,右边的则是右子树。此时问题就变成了左右子树两个子问题。所以该题用递归写即可。
代码
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 }