题目大意:给出一棵二叉树的后序和中序遍历,求其层序遍历。
思路:无需建树,按照根据后序、中序求前序的思路进行即可。通过一个下标来映射出层序遍历的结果,即根节点为i,则左儿子为i<<1,右儿子为i<<1|1(树根为1)。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
using namespace std;
const int N=30+5;
int n,post[N],in[N];
map<int,int> depth;
void pre(int root,int st,int en,int cnt){
if(st>en) return ;
int tem=st;
for(;tem<=en&&in[tem]!=post[root];tem++);
depth[cnt]=post[root];
pre(root-(en-tem+1),st,tem-1,cnt<<1);
pre(root-1,tem+1,en,cnt<<1|1);
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&post[i]);
for(int i=1;i<=n;i++) scanf("%d",&in[i]);
pre(n,1,n,1);
int flag=0;
for(map<int,int>::iterator it=depth.begin();it!=depth.end();it++){
if(flag) printf(" ");
flag=1;
printf("%d",it->second);
}
printf("\n");
return 0;
}