传送门
题意
给先序遍历和中序遍历,将二叉树镜面翻转后求层次遍历
思路
- 当前根为先序遍历的第一个结点
- 左子树的根为 当前根后一个结点
- 右子树的根为 当前根 + 中序遍历根前的结点个数
- 镜面翻转 == 先遍历右子树再遍历左子树
代码
#include <iostream>
#include <vector>
using namespace std;
const int maxn=1000;
int n;
vector<int> a[100];
int pre[maxn],in[maxn];
void cenci(int l,int r,int root,int index){
if(l>r) return ;
int mid=1;
for(;mid<=n;mid++){
if(pre[root]==in[mid]) break;
}
// cout<<l<<" "<<mid<<" "<<r<<endl;
a[index].push_back(pre[root]);
cenci(mid+1,r,root+1+mid-l,index+1);
cenci(l,mid-1,root+1,index+1);
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>in[i];
}
for(int i=1;i<=n;i++){
cin>>pre[i];
}
cenci(1,n,1,1);
int flag=0;
for(int i=0;i<=20;i++){
int k=a[i].size();
for(int j=0;j<k;j++){
if(flag)
cout<<" "<<a[i][j];
else{
flag=1;
cout<<a[i][j];
}
}
}
return 0;
}