【每日一题】力扣230.二叉搜索树中第K小的元素


题目

题目链接:力扣230.二叉搜索树中第K小的元素

给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。

示例 1:

img

输入:root = [3,1,4,null,2], k = 1
输出:1

示例 2:

img

输入:root = [5,3,6,2,4,null,null,1], k = 3
输出:3

提示:

  • 树中的节点数为 n
  • 1 <= k <= n <= 104
  • 0 <= Node.val <= 104

进阶:如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化算法?

解题思路

👉中序遍历

由于题目给的二叉树是二叉搜索树,所以可以根据中序遍历,把节点值存入数组中再直接返回第 K 大的数。这种方法比较简单,官方给的第二种方法比较麻烦,我就说一下大体的思路吧。第三种方法我是真的看不下去,直接手撕平衡树了,有兴趣的可以自己去看看。

👉优化

对于频繁的查找是可以优化的。

因为树是二叉树,所以想确定第 k 小的数的位置,可以根据树的子节点数确定第 K 小的数。这里用一个哈希表存储每个根节点的子节点数,这样可以遍历二叉树的节点查找第 k 小的数。

  • 如果节点的左子树的节点数小于 k-1 ,那么第 k 小的数一定在其右子树上
  • 如果等于,那么当前节点就是第 k
  • 如果大于,那就在左子树上

代码(C++)

中序遍历

class Solution {
   
public:
    vector<int> nums;
    void dfs(TreeNode *root) {
   
        if (!root)
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

聆听逝去的流

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值