题目说明:给出二叉树的后序遍历和中序遍历序列,输出层序遍历序列。
算法:递归建立二叉树,层序遍历。
postorder序列从后往前依次添加结点到树。记下当前的点在inorder序列中的位置,在右边找下一个点,如果找到了,添加该点为右孩子结点,并递归建立右子树;对左边重复此过程。二叉树建好后层序遍历一次就可以了。
代码:
#include<iostream>
#include<fstream>
#include<queue>
using namespace std;
#define MAX 35
int N;
int postorder[MAX];
int inorder[MAX];
struct Node{
int left;
int right;
}node[MAX];
int root;
queue<int> que;
int pocur;
//返回val在inorder序列中的位置
int findposition(int val,int l,int r){
for(int i=l;i<=r;i++){
if(inorder[i]==val){
return i;
}
}
return -1;
}
//递归建立树
void buildtree(int val,int incur,int leftedge,int rightedge){
int nextval=postorder[pocur];
//判断下一个点是否在右边
int innext=findposition(nextval,incur+1,rightedge);
if(innext!=-1){
node[val].right=nextval;
//建立右子树
pocur--;
buildtree(nextval,innext,incur+1,rightedge);
}
nextval=postorder[pocur];
//判断下一个点是否在左边
innext=findposition(nextval,leftedge,incur-1);
if(innext!=-1){
node[val].left=nextval;
//建立左子树
pocur--;
buildtree(nextval,innext,leftedge,incur-1);
}
return;
}
void leveltraversal(){
que.push(root);
printf("%d",root);
while(!que.empty()){
int val=que.front();
if(node[val].left>0)
que.push(node[val].left);
if(node[val].right>0)
que.push(node[val].right);
que.pop();
if(!que.empty())
printf(" %d",que.front());
}
}
int main(){
cin>>N;
for(int i=0;i<N;i++){
cin>>postorder[i];
}
for(int i=0;i<N;i++){
cin>>inorder[i];
}
//确定根结点
pocur=N-1;
int val=postorder[pocur];
int incur=findposition(val,0,N-1);
root=val;
pocur--;
buildtree(val,incur,0,N-1);
leveltraversal();
return 0;
}