题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805485033603072
题目大意:给出树的中序和后序,输出层序序列。
思路:递归,用数组模拟建树,bfs层序输出。
#include<bits/stdc++.h>
using namespace std;
const int maxn=50;
int n,post[maxn],in[maxn];
struct node{
int l,r;
}tree[maxn];
int build(int la,int ra,int lb,int rb){//中序、后序
if(la>ra) return -1;
int rt=post[rb],p1,p2;
p1=la;//在中序中找根rt
while(in[p1]!=rt){
p1++;
}
p2=p1-la;
tree[rt].l=build(la,p1-1,lb,lb+p2-1);
tree[rt].r=build(p1+1,ra,lb+p2,rb-1);
return rt;
}
void bfs(int x){ //层序输出
queue<int> q;
vector<int> ans;
q.push(x);
while(!q.empty()){
int t=q.front();
q.pop();
ans.push_back(t);
if(tree[t].l!=-1) q.push(tree[t].l);
if(tree[t].r!=-1) q.push(tree[t].r);
}
for(int i=0;i<ans.size();i++){
if(i==0) cout<<ans[i];
else cout<<' '<<ans[i];
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++) cin>>post[i];
for(int i=0;i<n;i++) cin>>in[i];
build(0,n-1,0,n-1);
bfs(post[n-1]);
}