本题前导:https://blog.csdn.net/destiny_balabala/article/details/99352715;
本题假设是如果判断不了,设该结点为右边的结点。
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
const int maxn=30;
bool flag=false;
int post[maxn],pre[maxn];
vector<int> ans;
void getin(int prel,int prer,int postl,int postr)
{
if(prel==prer)
{
ans.push_back(pre[prel]);
return ;
}
int i=prel+1;
while(pre[i]!=post[postr-1])i++;
if(i-prel-1>0)
getin(prel+1,i-1,postl,postl+i-2-prel);
else
flag=true;
ans.push_back(post[postr]);
getin(i,prer,postl+i-1-prel,postr-1);
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
scanf("%d",&pre[i]);
}
for(int i=0;i<n;i++)
{
scanf("%d",&post[i]);
}
getin(0,n-1,0,n-1);
if(flag==true)
printf("No\n");
else
printf("Yes\n");
for(int i=0;i<ans.size();i++)
{
printf("%d",ans[i]);
if(i!=n-1)
printf(" ");
else
printf("\n");
}
}