【PAT甲级】1115 Counting Nodes in a Binary Search Tree 二叉搜索树最后两层结点数量

原题链接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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值