#include
#include
#include <unordered_map>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
TreeNode* buildTree(vector& inorder, vector& postorder, int in_start, int in_end, int post_start, int post_end, unordered_map<int, int>& map) {
if (in_start > in_end || post_start > post_end) {
return NULL;
}
int root_val = postorder[post_end];
TreeNode* root = new TreeNode(root_val);
int root_index = map[root_val];
int left_size = root_index - in_start;
root->left = buildTree(inorder, postorder, in_start, root_index - 1, post_start, post_start + left_size - 1, map);
root->right = buildTree(inorder, postorder, root_index + 1, in_end, post_start + left_size, post_end - 1, map);
return root;
}
vector levelorderTraversal(TreeNode* root) {
vector result;
if (root == NULL) {
return result;
}
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
TreeNode* node = q.front();
q.pop();
result.push_back(node->val);
if (node->left != NULL) {
q.push(node->left);
}
if (node->right != NULL) {
q.push(node->right);
}
}
return result;
}
int main() {
int N;
cin >> N;
vector postorder(N);
vector inorder(N);
unordered_map<int, int> map;
for (int i = 0; i < N; i++) {
cin >> postorder[i];
}
for (int i = 0; i < N; i++) {
cin >> inorder[i];
map[inorder[i]] = i;
}
TreeNode* root = buildTree(inorder, postorder, 0, N - 1, 0, N - 1, map);
vector levelorder = levelorderTraversal(root);
for (int i = 0; i < levelorder.size(); i++) {
cout << levelorder[i];
if (i != levelorder.size() - 1) {
cout << " ";
}
}
return 0;