AcWing 1589. 构建二叉搜索树
原题链接
中等
作者:
零邪sword
,
2021-04-27 18:32:28
,
所有人可见
,
阅读 295
基本就是y总的代码,但是进行了一些注释
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;
int n;
int l[N],r[N];
int w[N],a[N];
int q[N];
//用于进行层次遍历,数组q用来代替队列
void bfs()
{
int hh = 0, tt = 0;
q[0] = 0;
while(hh <= tt)
{
//第一个t对应的是根节点的编号,往后将每一层的节点加入到q中
//t用来在l和r中取出编号t的左右子树的编号
int t = q[hh++];
if(l[t] != -1) q[++ tt] = l[t];
if(r[t] != -1) q[++ tt] = r[t];
}
//通过q[i]的顺序输出w数组即为答案所求的层次遍历
for(int i = 0; i < n; i++)
printf("%d ",w[q[i]]);
}
//用于建立二叉搜索树
void dfs(int u, int &k)
{
//如果当前位置为数组值为-1,则当前位置不存在叶节点
if(u == -1) return;
//进行中序遍历,找到最左子树,将数组a中的对应值赋给该节点
dfs(l[u], k);
//第一次赋值是在最左节点赋给当前节点数组a的最小值
w[u] = a[k++];
dfs(r[u], k);
}
int main()
{
scanf("%d", &n);
//读入子节点编号,存入数组中方便建树
for (int i = 0; i < n; i ++ ) scanf("%d%d", &l[i], &r[i]);
//读入要插入的数据,并将数据排序
for (int i = 0; i < n; i ++ ) scanf("%d", &a[i]);
sort(a, a+n);
int k = 0;
//通过dfs操作进行建树,使用一个数组w来模拟二叉搜索树
dfs(0, k);
//bfs实现层序遍历操作,得到本题需要的结果
bfs();
return 0;
}