本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1605. 二叉搜索树最后两层结点数量
原题传送:AcWing 1605. 二叉搜索树最后两层结点数量
二叉搜索树(BST)递归定义为具有以下属性的二叉树:
- 若它的左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值
- 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值
- 它的左、右子树也分别为二叉搜索树
将一系列数字按顺序插入到一个空的二叉搜索树中,然后,请你计算结果树的最低两层的结点个数。
输入格式
第一行包含整数 ,表示插入数字序列包含的数字个数。
第二行包含 个整数,表示插入数字序列。
输出格式
以如下格式,在一行中,输出结果树的最后两层的结点数:
n1 + n2 = n
n1是最底层结点数量,n2是倒数第二层结点数量,n是它们的和。
数据范围
, 插入数字 。
输入样例:
9
25 30 42 16 20 20 35 -5 28
输出样例:
2 + 4 = 6
思路:
根据二叉搜索树定义插入结点建树,dfs求最大深度并记录每层的结点数。
题解:
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int n, maxk;
int l[N], r[N], v[N], idx;
int cnt[N], max_depth;
void insert(int& u, int w)
{
if(!u)
{
u = ++idx;
v[u] = w;
}
else if(w <= v[u])
insert(l[u], w);
else
insert(r[u], w);
}
void dfs(int u, int depth)
{
if(!u)
return;
cnt[depth]++;
max_depth = max(max_depth, depth);
dfs(l[u], depth + 1);
dfs(r[u], depth + 1);
}
int main()
{
cin >> n;
int root = 0;
for(int i = 0; i < n; i++)
{
int w;
cin >> w;
insert(root, w);
}
dfs(root, 0);
int n1 = cnt[max_depth], n2 = cnt[max_depth - 1];
cout << n1 << " + " << n2 << " = " << n1 + n2 << endl;
return 0;
}