给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数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 <iostream>
#include<cstring>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
int post[35],in[35],pre[35],level[35];
int N=0;
void preTranverse(int l1,int r1,int l2,int r2,int id){
if(l1>r1||l2>r2) return;
int i,len1,len2;
for(i=l2;i<=r2;i++){
if(post[r1]==in[i]){
level[N]=id;
pre[N++]=in[i];
len1=i-l2;
len2=r2-i;
// printf("(%d %d ,%d %d,%d)\n",l1,r1,l2,r2,id);
break;
}
}
//if(i>r2) return;
preTranverse(l1,l1+len1-1,l2,i-1,id+1);
preTranverse(r1-len2,r1-1,i+1,r2,id+1);
}
int main(int argc, char** argv) {
int n,i,j;
cin>>n;
for(i=0;i<n;i++){
cin>>post[i];
}
for(i=0;i<n;i++){
cin>>in[i];
}
memset(level,-1,sizeof(level));
preTranverse(0,n-1,0,n-1,0);
/*for(i=0;i<n;i++){
cout<<pre[i]<<":"<<level[i]<<" ";
}
cout<<endl;
*/
int t=1,flag=0;
cout<<pre[0];
for(i=1;i<n;i++){
if(flag) break;
for(j=1;j<n;j++){
if(level[i]==-1){
flag=1;break;
}
if(level[j]==t){
cout<<" "<<pre[j];
}
}
++t;
}
return 0;
}