难度:4
知识点:多叉树,dfs,bfs
题意很简单,根据先序和层序遍历还原二叉树,思路就是遍历先序序列,然后从当前数的前面找它的父亲节点,当前节点先序遍历的前面可能为三种,一是父亲,这个时候直接求,然后是兄弟,这个时候间接求,三是兄弟的子孙,这个时候他们在层序遍历的序列里面实在当前点的后面的,我们略过这些点,
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define sz(x) ((int) x.size())
#define all(x) (x).begin(), (x).end()
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pa;
const int N = 1005;
int a[N], b[N], fa[N], rec[N];
vi v[N];
int main() {
int n;
while (cin >> n) {
for (int i = 0; i < N; i++) v[i].clear();
for (int i = 0; i < n; i++) { cin >> a[i]; rec[a[i]] = i; }
for (int i = 0; i < n; i++) cin >> b[i];
fa[b[1]] = b[0]; v[b[0]].pb(b[1]);
for (int i = 2; i < n; i++) {
int pos = i - 1;
while (rec[b[pos]] > rec[b[i]]) pos--;
if (rec[b[pos]] + 1 == rec[b[i]] && b[pos] < b[i]) {
fa[b[i]] = fa[b[pos]];
v[fa[b[pos]]].pb(b[i]);
} else {
fa[b[i]] = b[pos];
v[b[pos]].pb(b[i]);
}
}
for (int i = 1; i <= n; i++) {
cout << i << ":";
for (int j = 0; j < sz(v[i]); j++) cout << " " << v[i][j];
cout << endl;
}
}
return 0;
}