根据前或后遍历和中序遍历建立二叉树
不是最优解法,但只是原创的,记录一下省的忘
#include <bits/stdc++.h>
#include <limits.h>
#include <math.h>
#include <memory.h>
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <map>
#include <queue>
#include <stack>
#include <string>
#include <vector>
using namespace std;
#define ms(x, n) memset(x, n, sizeof(x))
#define wht() \
int _; \
for (scanf("%d", &_); _; _--)
#define For(i, a, b) for (int i = a; i <= (b); i++)
#define Rof(i, a, b) for (int i = a; i >= (b); i--)
#define ioss ios::sync_with_stdio(false)
#define all(a) a.begin(), a.end()
#define int long long
#define input(x) scanf("%lld", &x);
#define print(x) printf("%lld", x);
#define println(x, flag) \
printf("%lld", x); \
printf(!flag ? "\n" : " ");
typedef vector<int> vi;
typedef pair<int, int> pii;
const int maxn = 2e6 + 7;
const int maxm = 5e3 + 7;
const int MOD = 1e9 + 7;
const int mod = 998244353;
int min(int a, int b) { return a < b ? a : b; }
int max(int a, int b) { return a > b ? a : b; }
int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
bool cmp(int a, int b) { return a > b; }
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right)
: val(x), left(left), right(right) {}
};
const int N = 30 + 5;
int n, m, k;
int f[N], g[N];
void build(TreeNode *&r, int val, int le, int ri) {
if (r == nullptr) {
r = new TreeNode;
r->val = val;
r->left = r->right = nullptr;
return;
}
int u = -1, v = -1;
For(i, le, ri) {
if (g[i] == val) u = i;
if (g[i] == r->val) v = i;
}
// cout << u << " " << v << "\n";
if (u > v)
build(r->right, val, v + 1, ri);
else
build(r->left, val, le, v - 1);
}
vector<int> pre;
void predfs(TreeNode *r) {
if (r == nullptr) return;
pre.push_back(r->val);
predfs(r->left);
predfs(r->right);
}
int p[N], tot;
vector<int> bfs;
void Bfs(TreeNode *r) {
queue<TreeNode *> q;
q.push(r);
while (!q.empty()) {
TreeNode *cur = q.front();
q.pop();
bfs.push_back(cur->val);
if (cur->left != nullptr) q.push(cur->left);
if (cur->right != nullptr) q.push(cur->right);
}
}
void work() {
cin >> n;
For(i, 1, n) { cin >> f[i]; }
int u = -1;
For(i, 1, n) {
cin >> g[i];
if (g[i] == f[n]) {
u = i;
}
}
// cout << u << "\n";
TreeNode *root = nullptr;
Rof(i, n, 1) { build(root, f[i], 1, n); }
Bfs(root);
int fir = 0;
for (auto x : bfs) {
if (fir) cout << " ";
fir = 1;
cout << x;
}
}
signed main() {
#ifndef ONLINE_JUDGE
freopen("test.in", "r", stdin);
freopen("test.out", "w", stdout);
#endif
work();
}