#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
//在此处声明变量
int num,postOrder[33],inOrder[33];
struct node { //结构体node
int data;
node* lchild,*rchild;
};
//后序、中序序列建树
node* create(int postL,int postR,int inL,int inR) {
if(postL>postR || inL>inR) {
return NULL;
}
node* root=new node;
root->data=postOrder[postR];
int term;
for(term=inL;term<=inR;term++) {
//注意是inOrder[term]==postOrder[postR]
if(inOrder[term]==postOrder[postR]) {
break;
}
}
int numLeft=term-inL;
root->lchild=create(postL,postL+numLeft-1,inL,term-1);
root->rchild=create(postL+numLeft,postR-1,term+1,inR);
return root;
}
//层序遍历
int outnum=0; //已经输出的结点个数
void levelOrder(node* root) {
queue<node*> queuea;
queuea.push(root);
while(!queuea.empty()) {
node* now=queuea.front();
queuea.pop();
printf("%d",now->data);
outnum++;
if(outnum<num) {
printf(" ");
}
if(now->lchild) queuea.push(now->lchild);
if(now->rchild) queuea.push(now->rchild);
}
}
int main() {
scanf("%d",&num);
for(int i=0;i<num;i++) {
scanf("%d",&postOrder[i]); //存入数组下标i
}
for(int j=0;j<num;j++) {
scanf("%d",&inOrder[j]);
}
node *root=create(0,num-1,0,num-1);
levelOrder(root);
return 0;
}