当前位置: 首页 > news >正文

Leetcodehot 力扣热题100 二叉搜索树中第 K 小的元素

class Solution {
public:int res; // 用于存储第 k 小的元素int kthSmallest(TreeNode* root, int k) {inorder(root, k);  // 进行中序遍历并找到第 k 小的元素return res;  // 返回结果}private:// 中序遍历:遍历树的左子树、根节点和右子树void inorder(TreeNode* root, int &k) {if (root != nullptr) {  // 如果当前节点不是空节点inorder(root->left, k);  // 递归遍历左子树if (--k == 0)  // 每访问一个节点,减少 k,直到 k 减到 0res = root->val;  // 当 k == 0 时,记录当前节点的值为第 k 小的元素inorder(root->right, k);  // 递归遍历右子树}}
};

思路:

这个问题要求你找到二叉搜索树(BST)中的第 k 小的元素。二叉搜索树的性质是:对于每个节点,左子树的值都比该节点小,右子树的值都比该节点大。因此,通过中序遍历(左-根-右)遍历 BST,节点会按升序排列。所以第 k 小的元素就是中序遍历中的第 k 个元素。

详细步骤:

1. 中序遍历:从左子树开始遍历,访问根节点,再遍历右子树。由于是 BST,节点会按升序排列。

2. 在遍历过程中,每访问一个节点,就把计数器 k 减 1,当 k == 0 时,当前节点的值就是第 k 小的元素,记录下这个值。

3. 使用递归的方式遍历树,同时传递 k,这样可以保证每次递归的 k 都是最新的值。

解释:

• int &k:

为什么要加 &:k 变量是通过引用传递的,这样可以确保递归过程中 k 的值是共享的,能够在递归的每一层中更新。如果没有使用引用传递,k 的值会被复制,每一层递归中的 k 都是一个副本,递归返回时不会影响原来的 k 值。因此,使用引用可以保证每次递归时,k 的值是动态变化的,直到找到第 k 小的元素。

引用的作用:通过引用传递,k 在每次递归时的变化会反映到父级递归中,这样就能准确计算出当前是第几个元素。

代码运行步骤:

1. kthSmallest 被调用时,传入根节点和 k,然后调用 inorder 函数开始递归遍历。

2. 递归从左子树开始,直到遍历到根节点,递归继续到右子树。

3. 每遍历一个节点,k 减 1,当 k == 0 时,记录下当前节点的值。

4. 中序遍历会按升序访问所有节点,因此一旦 k == 0,记录的值就是第 k 小的元素。

例子:

假设有如下二叉搜索树:

      5

     / \

    3   6

   / \  

  2   4

调用 kthSmallest(root, 3):

• 第一步:从根节点 5 出发,先递归遍历左子树。

• 第二步:遍历左子树到达节点 2,此时 k = 3,继续返回到 3。

• 第三步:访问节点 3,此时 k = 2,继续返回到 4。

• 第四步:访问节点 4,此时 k = 1,继续返回到 5。

• 第五步:访问节点 5,此时 k = 0,记录结果为 5。

最终返回 5,就是第 3 小的元素。

总结:

• 这个算法利用中序遍历的特性,借助 k 来找到第 k 小的元素。

• 使用引用传递 k,确保递归过程中对 k 的修改能够反映到每一层递归,避免了值传递时的副本问题。

如果你有其他问题,随时告诉我!

http://www.lryc.cn/news/535152.html

相关文章:

  • Awtk 如何添加开机画面
  • 关于多语言商城系统的开发流程
  • IDEA中常见问题汇总
  • 计算机视觉-拟合
  • CSS 实现下拉菜单效果实例解析
  • DeepSeek模拟阿里面试——Mysql
  • MVVM设计模式
  • 解决:Cannot find a valid baseurl for repo: base/7/x86_64
  • ffmpeg -codecs
  • 社区版IDEA中配置TomCat(详细版)
  • 强化学习 DPO 算法:基于人类偏好,颠覆 PPO 传统策略
  • 长安链支撑全国不动产登记数据可信流通
  • GitCode 助力 Dora SSR:开启游戏开发新征程
  • 获取 Windows 视频时长的正确方式——Windows Shell API 深度解析
  • Linux系统安装Nginx详解(适用于CentOS 7)
  • 深入理解Java对接DeepSeek
  • flutter isolate到底是啥
  • 深入剖析 Apache Shiro550 反序列化漏洞及复现
  • 计算机毕业设计——Springboot的简历系统
  • 【kubernetes组件合集】深入解析Kubernetes组件之三:client-go
  • 线程池-抢票系统性能优化
  • WebSocket 握手过程
  • VMware 虚拟机 ubuntu 20.04 扩容工作硬盘
  • 备战蓝桥杯:二分算法之牛可乐和魔法封印问题
  • 普通用户授权docker使用权限
  • 【实战篇】DeepSeek + ElevenLabs:让人工智能“开口说话”,打造你的专属语音助手!
  • Vision Transformer:打破CNN垄断,全局注意力机制重塑计算机视觉范式
  • LabVIEW国内外开发的区别
  • 【并发控制、更新、版本控制】.NET开源ORM框架 SqlSugar 系列
  • 淘宝App交易链路终端混合场景体验探索