题意:已知后序和中序遍历,求层序遍历。
思路:正常建二叉树,然后广搜即可。
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
using namespace std;
#define inf 0x3f3f3f3f
#define pb push_back
typedef pair<int,int> pa;
const int N = 105;
int post[N],in[N];
struct node
{
int l,r,id;
}tr[N<<2];
int ans[N],idx;
int dfs(int l1,int r1,int l2,int r2)
{
int i;
for(i=l1;i<=r1;i++)
if(in[i]==post[r2]) break;
if(i>r1) return 0;
int x=in[i];
tr[i].id=x;
if(l1!=i)
tr[x].l=dfs(l1,i-1,l2,l2+i-l1-1);
if(r1!=i)
tr[x].r=dfs(i+1,r1,r2-(r1-i),r2-1);
return x;
}
int flag;
void solve(int x)
{
queue<int> q;
q.push(x);
int cnt=0;
while(!q.empty())
{
int x=q.front();
q.pop();
ans[++cnt]=x;
if(tr[x].l) q.push(tr[x].l);
if(tr[x].r) q.push(tr[x].r);
}
for(int i=1;i<=cnt;i++)
{
if(i>1) cout<<" ";
cout<<ans[i];
}
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>post[i];
for(int i=1;i<=n;i++)
cin>>in[i];
int root=dfs(1,n,1,n);
solve(root);
return 0;
}