#include<iostream>
#include<string>
#include<sstream>
#include<vector>
using namespace std;
struct Tnode{
int val;
Tnode* left;
Tnode* right;
Tnode(int x=0, Tnode* left=nullptr, Tnode* right=nullptr):
val(x), left(left), right(right){ };
};
struct Tree{
private:
void post_f(Tnode* root);
void pre_f(Tnode* root);
Tnode* createTree_f(vector<int>& pres, vector<int>& ins, int i, int j, int n);
Tnode* create_post_in_f(vector<int>& posts, vector<int>& ins, int i, int j, int n);
public:
Tnode* root;
void createTree(vector<int>& pres, vector<int>& ins);
void createTree_post_ins(vector<int>& posts, vector<int>& ins);
void post_order_print();
void pre_order_print();
Tree(){
root = nullptr;
}
};
int n;
vector<int> getData(string& s);
int main(){
cin>>n; string s1, s2;
cin.get();
getline(cin, s1);
getline(cin, s2);
vector<int> posts = getData(s1);
vector<int> ins = getData(s2);
Tree t;
t.createTree_post_ins(posts, ins);
t.pre_order_print();
return 0;
}
vector<int> getData(string& s){
istringstream iss(s);
vector<int> res; int x;
while(iss>>x){
res.push_back(x);
}
return res;
}
void Tree::post_order_print(){
post_f(root);
cout<<endl;
}
void Tree::pre_order_print(){
pre_f(root);
cout<<endl;
}
void Tree::pre_f(Tnode* root){
if(root != nullptr){
cout<<root->val<<" ";
pre_f(root->left);
pre_f(root->right);
}
}
void Tree::post_f(Tnode* root){
if(root != nullptr){
post_f(root->left);
post_f(root->right);
cout<<root->val<<" ";
}
}
void Tree::createTree(vector<int>& pres, vector<int>& ins){
this->root = this->createTree_f(pres, ins, 0, 0, n);
}
Tnode* Tree::createTree_f(vector<int>& pres, vector<int>& ins, int i, int j, int n){
if(n <= 0) return nullptr;
Tnode* cur = new Tnode(pres[i]);
int in_pos = j;
while(ins[in_pos] != pres[i]) in_pos++;
int left_size = in_pos - j;
cur->left = createTree_f(pres, ins, i+1, j, left_size);
cur->right = createTree_f(pres, ins, i+left_size+1, in_pos+1, n-left_size-1);
return cur;
}
void Tree::createTree_post_ins(vector<int>& posts, vector<int>& ins){
this->root = this->create_post_in_f(posts, ins, 0, 0, n);
}
Tnode* Tree::create_post_in_f(vector<int>& posts, vector<int>& ins, int i, int j, int n){
if(n <= 0) return nullptr;
Tnode* cur = new Tnode(posts[i + n-1]);
int in_pos = j;
while(ins[in_pos] != posts[i + n-1]) in_pos++;
int left_size = in_pos - j;
cur->left = create_post_in_f(posts, ins, i, j, left_size);
cur->right = create_post_in_f(posts, ins, i+left_size, in_pos+1, n-left_size-1);
return cur;
}