1. 根据中序遍历建二叉树
2. 广搜+队列输出层序遍历
#include <iostream>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <set>
#include <vector>
#include <iomanip>
#include <map>
#include <ctime>
#include <cstdlib>
#include <queue>
#define ll long long
#define MAX_SIZE 1 << 20
using namespace std;
int n, cnt, flag, a[110], lc[110], rc[110], d[110];
void build(int rt) {
if(rt == -1) return;
build(lc[rt]);
d[rt] = a[cnt++];
build(rc[rt]);
}
void bfs() {
queue<int> q;
q.push(0);
while (!q.empty()) {
int t = q.front();
q.pop();
if(flag) cout << " ";
else flag = 1;
cout << d[t];
if(lc[t] != -1) q.push(lc[t]);
if(rc[t] != -1) q.push(rc[t]);
}
}
int main() {
cin >> n;
for(int i = 0; i < n; i++)
cin >> lc[i] >> rc[i];
for(int i = 0; i < n; i++)
cin >> a[i];
sort(a, a + n);
build(0);
bfs();
}