原题链接PTA | 程序设计类实验辅助教学平台 (pintia.cn)
ACwing链接1605. 二叉搜索树最后两层结点数量 - AcWing题库
题意
计算二叉搜索树最后两层结点数量
注意 ——左结点 <= root < 右结点
二叉搜索树 (BST) 递归定义为具有以下属性的二叉树:
- 若它的左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值
- 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值
- 它的左、右子树也分别为二叉搜索树
此类题型有两处需要积累,直接当做模板记忆
1. 如何构建BST(无论哪一种BST)
2. 怎么计算层数
#include <iostream>
using namespace std;
const int N = 1010;
int n;
int l[N], r[N], v[N], idx;
int cnt[N], max_depth; // cnt[N] 每一层的节点数 max_depth 最大深度
void insert(int& u, int w) // 构建BST
{
if (u == 0) // 如果根节点为0 或 没有这个点 则创建这个点并给其赋值
{
u = ++ idx; // idx == 1 即根节点的idx 是1
v[u] = w; // v[1] = w;
}
else if (w <= v[u]) insert(l[u], w); //如果要插入的点 <= 根节点 则将其插入l[u]
else insert(r[u], w); // 否则插入r[u] 这里u是下标
}
void dfs(int u, int depth) // 计算层数的
{
if (!u) return;
cnt[depth] ++ ; // 计算每一层节点个数
max_depth = max(max_depth, depth);
dfs(l[u], depth + 1); // 遍历到u的左儿子时, depth + 1
dfs(r[u], depth + 1);
}
int main()
{
cin >> n;
int root = 0;
for (int i = 0; i < n; i ++ ) // n为插入的数字个数
{
int w;
cin >> w;
insert(root, w); // 用这几个数字构建二叉搜索树
}
dfs(root, 0); // 从root开始dfs, root是第0层
int n1 = cnt[max_depth], n2 = cnt[max_depth - 1];
printf("%d + %d = %d\n", n1, n2, n1 + n2);
return 0;
}