#include<cstdio> #include<vector> using namespace std; const int maxn=35; struct node{ int k; struct node *lc; struct node *rc; }; int n; int pre[maxn]; int post[maxn]; bool Unique=true; void create(node *&root,int preL,int preR,int postL,int postR) { if(preL>preR)return ; node *t=new node; int rootE=pre[preL]; t->k=rootE; t->lc=t->rc=nullptr; root=t; if(preL==preR)return ; int nxtRoot=pre[preL+1]; int i,numLeft=0; for(i=postL;i<=postR-1;i++){ numLeft++; if(post[i]==nxtRoot){ break; } } //if(i==postR-1)Unique=false; //当区间缩小到只有两个元素的时候判断唯一性 //若出现例如34,43的情况就是不唯一 if(pre[preL]==post[postR] &&pre[preR]==post[postL]){ Unique=false; //此处可以控制产生树的形状 create(root->rc,preL+1,preL+numLeft,postL,i); create(root->lc,preL+numLeft+1,preR,i+1,postR-1); } else { create(root->lc,preL+1,preL+numLeft,postL,i); create(root->rc,preL+numLeft+1,preR,i+1,postR-1); } } void PreOrder(node *root) { if(root==nullptr)return ; printf("%d",root->k); PreOrder(root->lc); PreOrder(root->rc); } void PostOrder(node *root) { if(root==nullptr)return ; PostOrder(root->lc); PostOrder(root->rc); printf("%d",root->k); } vector<int>v; void InOrder(node *root) { if(root==nullptr)return ; InOrder(root->lc); v.push_back(root->k); InOrder(root->rc); } //#define debug int main() { #ifdef debug freopen("in.txt","r",stdin); #endif 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(root,0,n-1,0,n-1); InOrder(root); if(Unique)printf("Yes "); else printf("No "); for(int i=0;i<v.size();i++){ printf("%d",v[i]); if(i!=v.size()-1)printf(" "); else printf(" "); } #ifdef debug getchar(); #endif }