AcWing 1589. 构建二叉搜索树
原题链接
中等
作者:
songpx
,
2021-02-21 15:50:07
,
所有人可见
,
阅读 294
- 按照下标,把节点组织起来
- 把值存储起来然后排序,就是中序遍历的值,然后我们通过dfs这个东西得到中序遍历的序列。
- 注意在dfs里面,由于不是完全二叉树,所以不能用>n判断,需要看左右是不是-1
- 得到中序序列和中序值,对每个节点复制
- 然后bfs这个树,得到层次遍历
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N = 110;
int n, idx;
int l[N], r[N], v[N];
int in[N], val[N];
void dfs(int u)
{
if (l[u] != -1) dfs(l[u]);
in[idx++] = u;
if (r[u] != -1) dfs(r[u]);
}
void bfs(int u)
{
queue<int> q;
q.push(u);
cout << v[u];
while (q.size())
{
auto t = q.front();
q.pop();
if (t != u) cout << ' ' << v[t];
if (~l[t]) q.push(l[t]);
if (~r[t]) q.push(r[t]);
}
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++) cin >> l[i] >> r[i];
for (int i = 0; i < n; i++) cin >> val[i];
sort(val, val + n);
dfs(0);
for (int i = 0; i < n; i++) v[in[i]] = val[i];
bfs(0);
return 0;
}