给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
注:与已知前序和中序,求层序遍历的题类似,只不过此题是镜面反转,则只用将2index+1与2index+2换个位置即可。
#include <bits/stdc++.h>
using namespace std;
vector<int> level(10000,-1);
void find(int* in,int* pre,int len,int index)
{
if(len==0) return ;
int i;
for(i=0;i<len;i++){
if(in[i]==(*pre)) break;
}
level[index]=(*pre);
find(in,pre+1,i,2*index+2);
find(in+i+1,pre+i+1,len-i-1,2*index+1);
}
int main()
{
int n;
cin>>n;
int in[n],pre[n];
for(int i=0;i<n;i++) cin>>in[i];
for(int i=0;i<n;i++) cin>>pre[i];
find(in,pre,n,0);
for(int i=0,f=0;i<10000;i++){
if(f==1&&level[i]!=-1) cout<<" ";
if(level[i]!=-1){
cout<<level[i];
f=1;
}
}
}