解题思路:单纯的二叉树构造和遍历。镜像就是构树的时候左右子节点反一下。
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int pre[50],mid[50];
struct node
{
int u,l,r;
}s[80];
int build(int pl,int pr,int ml,int mr)
{
if(pl>pr) return -1;
int r=pre[pl],k=ml;
while(mid[k]!=r) k++;
int rtl=build(pl+1,pl+k-ml,ml,k-1);
int rtr=build(pl+k-ml+1,pr,k+1,mr);
s[r].l=rtr;
s[r].r=rtl;
return r;
}
void bfs(int r)
{
queue<int> q;
q.push(r);
printf("%d",r);
while(!q.empty())
{
int u=q.front();
q.pop();
if(u!=r)
printf(" %d",u);
if(s[u].l!=-1)
q.push(s[u].l);
if(s[u].r!=-1)
q.push(s[u].r);
}
}
int main()
{
//freopen("t.txt","r",stdin);
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&mid[i]);
}
for(int i=0;i<n;i++)
{
scanf("%d",&pre[i]);
}
int r=build(0,n-1,0,n-1);
bfs(r);
return 0;
}