Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and inorder traversal sequences, you are supposed to output the level order traversal sequence of the corresponding binary tree.
Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N (≤), the total number of nodes in the binary tree. The second line gives the postorder sequence and the third line gives the inorder sequence. All the numbers in a line are separated by a space.
Output Specification:
For each test case, print in one line the level order traversal sequence of the corresponding binary tree. All the numbers in a line must be separated by exactly one space, and there must be no extra space at the end of the line.
Sample Input:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
Sample Output:
4 1 6 3 5 7 2
这个推了蛮久的。。。。。不太熟练
//左子树 if(k-l2==0){ tree[root].l = -1;//左子树为空 } else{ buildTree(2*root,l1,l1+k-l2-1,l2,k-1); } //右子树 if(k+1>r2){ tree[root].r = -1;//右子树为空 } else{ buildTree(2*root+1,l1+k-l2,r1-1,k+1,r2); }
AC代码:
#include<bits/stdc++.h> using namespace std; int post[35]; int in[35]; int n; struct node{ int v; int l; int r; }tree[2005]; queue<int>q; void buildTree(int root,int l1,int r1,int l2,int r2){//后序,中序 //cout<<root<<" "<<l1<<"-"<<r1<<" "<<l2<<"-"<<r2<<endl; //先找根节点 tree[root].v = post[r1]; if(l1==r1){ //只有一个节点 tree[root].l = -1; tree[root].r = -1; return; }else{ tree[root].l = 2*root; tree[root].r = 2*root+1; } //找一下根在中序上的位置 int k; for(int i=l2;i<=r2;i++){ if(in[i]==post[r1]){ k=i;//前面k-l2个数就是左子树 break; } } //左子树 if(k-l2==0){ tree[root].l = -1;//左子树为空 } else{ buildTree(2*root,l1,l1+k-l2-1,l2,k-1); } //右子树 if(k+1>r2){ tree[root].r = -1;//右子树为空 } else{ buildTree(2*root+1,l1+k-l2,r1-1,k+1,r2); } } int main(){ int n; cin>>n; for(int i=1;i<=n;i++){ cin>>post[i]; } for(int i=1;i<=n;i++){ cin>>in[i]; } buildTree(1,1,n,1,n); //bfs 层序 while(!q.empty()) q.pop(); q.push(1); while(!q.empty()){ node x=tree[q.front()]; q.pop(); cout<<x.v; if(x.l!=-1){ q.push(x.l); } if(x.r!=-1){ q.push(x.r); } if(!q.empty()){ cout<<" "; } } return 0; }