5-10 树的遍历 (25分)
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
输出样例:
4 1 6 3 5 7 2
#include <cstdio>
#include <cstring>
#include <queue>
#include <iostream>
using namespace std;
int tree[10000][2];
int in[35],post[35];
int BuildTree(int in[],int post[],int n){
int i,node=post[n-1];
for(i=0;i<n;i++){
if(in[i]==node){
break;
}
}
if(i>0){
tree[node][0]=BuildTree(in,post,i);
}
if(n-i-1>0){
tree[node][1]=BuildTree(in+i+1,post+i,n-i-1);
}
return node;
}
void bfs(int fa){
queue<int> q;
q.push(fa);
cout<<fa;
while(!q.empty()){
int head=q.front();
q.pop();
if(tree[head][0]){
q.push(tree[head][0]);
cout<<' '<<tree[head][0];
}
if(tree[head][1]){
q.push(tree[head][1]);
cout<<' '<<tree[head][1];
}
}
return;
}
int main(){
int fa,n;
cin>>n;
memset(tree,0,sizeof(tree));
for(int i=0;i<n;i++){
cin>>post[i];
}
for(int i=0;i<n;i++){
cin>>in[i];
}
fa=BuildTree(in,post,n);
bfs(fa);
return 0;
}