传送门
题意
给后序遍历和中序遍历,求层次遍历
思路
- 后续遍历的最后一个结点为中序遍历的根
- 右子树的根为 当前根的前一个结点
- 左子树的根为 当前根 — 中序遍历根的后面结点个数
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn=1000;
int n;
int post[maxn],in[maxn];
vector <int> a[100];
void cenci(int l,int r,int root,int index){
if(l>r) return ;
int mid=1;
for(mid=1;mid<=n;mid++){
if(in[mid]==post[root]) break;
}
a[index].push_back(post[root]);
// cout<<l<<" "<<mid<<" "<<r<<" "<<endl;
cenci(l,mid-1,root-1-r+mid,index+1);
cenci(mid+1,r,root-1,index+1);
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>post[i];
}
for(int i=1;i<=n;i++){
cin>>in[i];
}
cenci(1,n,n,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;
}