//pat A1119 Pre- and Post-order Traversals(30 分)
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=40;
struct node{
int data;
node *left,*right;
};
int pre[maxn],post[maxn];
bool flag=false;
int n;
node* create(int preL,int preR,int postL,int postR){
if(postL>postR){
return NULL;
}
node* root=new node;
root->data=pre[preL];
if(postL==postR){
root->left=root->right=NULL;
return root;
}
int k;//找到后序序列中对应先序序列第二个结点的结点,它或为左子树的根结点,也可能左子树不存在,为右子树的根结点
for(k=postL;k<=postR;k++){
if(post[k]==pre[preL+1]){
break;
}
}
if(k==postR-1){//此时二叉树是单支的,无法确定是左子树还是右子树
flag=true;
}
int leftNum=k-postL+1;
root->left=create(preL+1,preL+leftNum,postL,k);
root->right=create(preL+leftNum+1,preR,k+1,postR-1);
return root;
}
int num=0;
void inOrder(node* root){
if(root==NULL){
return;
}
inOrder(root->left);
printf("%d",root->data);
if(num!=n-1){
printf(" ");
}
num++;
inOrder(root->right);
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",pre+i);
}
for(int i=0;i<n;i++){
scanf("%d",post+i);
}
node* root=create(0,n-1,0,n-1);
if(flag){
printf("No\n");
}
else{
printf("Yes\n");
}
inOrder(root);
printf("\n");
return 0;
}