1020 Tree Traversals (25)(25 分)
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 (<=30), 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
给出后序和中序,输出层序遍历。使用递归求树根,记录左右子树,借助队列输出层序:
#include<stdio.h>
#include<queue>
int post[30],in[30];
int left[30]={0},right[30]={0};
int buildT(int p1,int p2,int i1,int i2){
int root=post[p2];
if(p1==p2){
return root;
}else if(p1>p2){
return 0;
}
int ri=i1;
for(;ri<=i2;ri++){
if(in[ri]==root) break;
}
int leftN=ri-i1;
left[root]=buildT(p1,p1+leftN-1,i1,ri-1);//left
right[root]=buildT(p1+leftN,p2-1,ri+1,i2);//right
return root;
}
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",post+i);
for(int i=0;i<n;i++)
scanf("%d",in+i);
buildT(0,n-1,0,n-1);
std::queue<int> q;
int root=post[n-1];
printf("%d",root);
if(left[root]) q.push(left[root]);
if(right[root]) q.push(right[root]);
while(!q.empty()){
int root=q.front();
q.pop();printf(" %d",root);
if(left[root]) q.push(left[root]);
if(right[root]) q.push(right[root]);
}
return 0;
}