根据postorder后序和inorder中序遍历,求level层次遍历
后序可以得出根在集合的最后,再根据中序划分左右子树集合,递归建树
建树后bfs输出层次遍历
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int N=50;
int last[N],mid[N],n,cnt=0,start[N];
queue<int> q;
struct node{
int l,r;
}e[N];
int findL(int k){
for(int i=0;i<n;i++)
if(k==last[i])
return i;
return -1;
}
void build(int a[],int rt){
int lson[N]={0},rson[N]={0},lrt,rrt;
int left=1,ln=0,rn=0,lbig=-1,rbig=-1;
for(int i=0;a[i];i++){
if(a[i]==rt){
left=0;continue;
}
if(left){
lson[ln++]=a[i];
if(findL(a[i])>lbig)
lbig=findL(a[i]),lrt=a[i];
}
else{
rson[rn++]=a[i];
if(findL(a[i])>rbig)
rbig=findL(a[i]),rrt=a[i];
}
}
if(ln)
build(lson,lrt),e[rt].l=lrt;
if(rn)
build(rson,rrt),e[rt].r=rrt;
}
void bfs(int rt){
q.push(rt);
printf("%d",rt);
while(!q.empty()){
int top=q.front();
q.pop();
if(e[top].l)
q.push(e[top].l),printf(" %d",e[top].l);
if(e[top].r)
q.push(e[top].r),printf(" %d",e[top].r);
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++)
scanf("%d",&last[i]);
for(int i=0;i<n;i++)
scanf("%d",&mid[i]);
build(mid,last[n-1]);
bfs(last[n-1]);
return 0;
}
代码2 不建树,直接输出
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int N=50;
int last[N],mid[N],n;
struct node{
int v,l,r;
}t,lson,rson;
queue<node> q;
int findL(int k){
for(int i=0;i<n;i++)
if(k==last[i])
return i;
return -1;
}
void bfs(){
t.v=last[n-1],t.l=0,t.r=n-1;
q.push(t);
printf("%d",last[n-1]);
while(!q.empty()){
t=q.front();
q.pop();
int lbig=-1,rbig=-1,left=1;
lson.l=t.l,rson.r=t.r;
for(int i=t.l;i<=t.r;i++){
if(mid[i]==t.v){
rson.l=i+1,left=0;continue;
}
if(left){
lson.r=i;
if(findL(mid[i])>lbig)
lbig=findL(mid[i]),lson.v=mid[i];
}
else{
if(findL(mid[i])>rbig)
rbig=findL(mid[i]),rson.v=mid[i];
}
}
if(lbig!=-1)
q.push(lson),printf(" %d",lson.v);
if(rbig!=-1)
q.push(rson),printf(" %d",rson.v);
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++)
scanf("%d",&last[i]);
for(int i=0;i<n;i++)
scanf("%d",&mid[i]);
bfs();
return 0;
}