题目链接
题意:
给你二叉树的后序遍历和中序遍历,让你输出层序遍历。
分析:
这个题可以递归着建二叉树,因为后序遍历的最后一个数就是这棵树的根节点,然后在中序遍历中找到这个根节点,然后中序遍历中这个根节点左边的位置就是左子树,右边的就是右子树,而且后序遍历也遵循这个规律,因为后序遍历是左右中嘛,下面具体看代码吧!
#include<iostream>
#include<cstdio>
using namespace std;
const int N = 100000;
int tr[N];
int idx;
int a[N],b[N],n;
void dfs(int u,int s1,int e1,int s2,int e2){
if(s1 > e1 || s2 > e2) return;
tr[u] = a[e2];
int k;
for(int i=s1;i<=e1;i++)
if(b[i] == a[e2]){
k = i;
break;
}
dfs(u*2,s1,k-1,s2,s2+k-s1-1);
dfs(u*2+1,k+1,e1,s2+k-s1,e2-1);
}
void print(int u){
if(tr[u] != 654561655){
printf("%d ",tr[u]);
print(u*2);
print(u*2+1);
}
}
int main(){
for(int i=1;i<N;i++) tr[i] = 654561655;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
dfs(1,1,n,1,n);
int cnt = 0;
for(int i=1;i<N;i++){
if(tr[i] != 654561655){
printf("%d",tr[i]);
cnt++;
if(cnt != n) printf(" ");
}
}
return 0;
}