题目描述
给出一颗二叉树的后序和中序遍历结果,输出这颗二叉树的层次遍历结果。
输入
第一行一个整数n(<= 30),表示二叉树上结点的个数。
第二行n个整数表示后序遍历结果。
第三行n个整数表示中序遍历结果。
输出
输出层次遍历结果。
样例输入
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;
const int maxn=50;
struct node //节点
{
int date;
node* ld;
node* rd;
} ;
int pre[maxn],in[maxn],post[maxn];
int n; //节点个数
node* create(int postFirst,int postEnd,int inFirst,int inEnd) //由后序和中序构建一颗树 形参分别为后序和中序排列的首元素尾元素
{
if(postFirst>postEnd) //如果遍历到后序的首元素大于后序的尾元素下标(结点全部遍历完) 结束
return NULL;
node* root=new node; //建立一个新的节点,存放当前二叉树的根节点
root->date =post[postEnd]; //新节点的数据域为当前根节点的值
int k;
for(k=inFirst;k<=inEnd;k++) //找到 中序数组中与后序尾元素大小相等的元素 记录下标 k
{
if(in[k]==post[postEnd])
break;
}
int numleft=k-inFirst; //该下标即为左子树的节点个数
root->ld =create(postFirst,postFirst+numleft-1,inFirst,k-1);//递归找子序列的左子树和右子树
root->rd =create(postFirst+numleft,postEnd-1,k+1,inEnd);
return root;
}
int num=0; //已经输出的节点个数,便于空格输出
void bfs(node* root)
{
queue<node*> q;
q.push(root);
while(!q.empty() )
{
node* now=q.front() ;
q.pop() ;
cout<<now->date;
num++;
if(num<n) cout<<' ';
if(now->ld !=NULL) q.push(now->ld );
if(now->rd !=NULL) q.push(now->rd );
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++) //后序输入
cin>>post[i];
for(int i=0;i<n;i++) //中序输入
cin>>in[i];
node* root=create(0,n-1,0,n-1);
bfs(root); //层序输出
return 0;
}