给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(<=30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
7 1 2 3 4 5 6 7 4 1 3 2 6 5 7
输出样例:
4 6 1 7 5 3 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 postTranverse(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(pre[l1]==in[i]){
level[N]=id;
post[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;
postTranverse(r1-len2+1,r1,i+1,r2,id+1);
postTranverse(l1+1,l1+len1,l2,i-1,id+1);
}
int main(int argc, char** argv) {
int n,i,j;
cin>>n;
for(i=0;i<n;i++){
cin>>in[i];
}
for(i=0;i<n;i++){
cin>>pre[i];
}
memset(level,-1,sizeof(level));
postTranverse(0,n-1,0,n-1,0);
/* for(i=0;i<n;i++){
cout<<post[i]<<":"<<level[i]<<" ";
}
cout<<endl;
*/
int t=1,flag=0;
cout<<post[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<<" "<<post[j];
}
}
++t;
}
return 0;
}