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

二叉树题解——二叉搜索树中第 K 小的元素【LeetCode】使用外部变量ans记录答案

230. 二叉搜索树中第 K 小的元素

由于中序遍历就是在从小到大遍历节点值,所以遍历到的第 k 个节点值就是答案。

一、算法逻辑(逐步通顺讲解每一步思路)

该题目要求在一棵 二叉搜索树(BST) 中找到第 k 小的元素。

我们知道 BST 的中序遍历(左→根→右)会生成一个升序序列,因此,只要对整棵树进行中序遍历,并记录遍历到的第 k 个节点的值,即可得到答案。

该算法的流程如下:

✅ 1️⃣ 定义辅助变量:

  • ans 用于记录第 k 小的元素;

  • k 是倒计时变量,每访问一个节点就减 1。

✅ 2️⃣ 定义中序遍历函数 dfs(node)

  • 遇到空节点时返回;

  • 优先递归访问左子树;

  • 每访问一个节点,就将 k -= 1

  • 如果此时 k == 0,说明当前节点就是第 k 小的元素,将其值赋给 ans

  • 然后递归右子树。

✅ 3️⃣ 使用 nonlocal 保证在递归过程中能修改外部变量 kans

✅ 4️⃣ 当 k == 0 时,整个递归过程中都会提前跳出剩余分支,从而实现剪枝加速

✅ 5️⃣ 遍历完成后,返回记录的 ans 即可。


二、核心点总结

该算法的核心在于:

利用 BST 的中序遍历特性,使节点值按升序访问,倒数计数直到第 k 个元素,即为结果。

✅ 利用了 BST 的有序性,不需要额外排序;
✅ 通过中序遍历直接按顺序找到第 k 个元素;
✅ 使用 k == 0 作为提前剪枝条件,节省时间;
✅ 用 nonlocal 管理共享变量,递归写法清晰优雅。

class Solution:def kthSmallest(self, root: Optional[TreeNode], k: int) -> int:ans = 0def dfs(node:Optional[TreeNode]) -> None:nonlocal k, ansif node is None or k == 0:return dfs(node.left)k -= 1if k == 0:ans = node.valdfs(node.right)dfs(root)return ans

三、时间复杂度分析

最坏情况:树是单链结构,或者 k 是最后一个元素

  • 最多访问 k 个节点就能得到答案

  • 所以时间复杂度为:

O(k) —— 只需访问前 k 小的节点

最坏情况下若 k = n(整棵树都得遍历),则为 O(n)


四、空间复杂度分析

空间消耗来自递归栈:

  • 最多递归树的高度层数,设为 h

  • 平衡树的高度约为 log n,最坏是 n(单链)

因此空间复杂度为:

O(h),即树的高度,最坏为 O(n),平均为 O(log n)


✅ 总结一句话

该算法借助 BST 中序遍历的升序性质,使用递归计数方式高效找出第 k 小元素,时间复杂度为 O(k),空间复杂度为 O(h)。是 BST 场景下选第 k 小/大元素的经典且高效做法

http://www.dtcms.com/a/267543.html

相关文章:

  • C++ 网络编程(15) 利用asio协程搭建异步服务器
  • 【大模型】到底什么是Function Calling和MCP,以及和ReAct推理的关系是什么?
  • [学习] 深入理解 POSIX
  • 面试150 最长连续序列
  • Node.js worker_threads深入讲解教程
  • 【LeetCode102.二叉树的层序遍历】vs.【LeetCode103.二叉树的锯齿形层序遍历】
  • Apollo自动驾驶系统中Planning模块的架构设计与核心逻辑解析(流程伪代码示例)
  • 45-使用scale实现图形缩放
  • 探索 .NET 桌面开发:WinForms、WPF、.NET MAUI 和 Avalonia 的全面对比(截至2025年7月)
  • 炼丹炉 TD-trainer 的安装与部署,LoRA、dreambooth
  • <三>Sping-AI alibaba 文生图
  • Cursor/VScode ,点击运行按钮,就打开新的终端,如何设置为在当前终端运行文件而不是重新打开终端----一招搞定篇
  • 数字孪生技术引领UI前端设计新潮流:虚拟现实的深度集成
  • 在sf=0.1时测试fireducks、duckdb、polars的tpch
  • OpenLayers 设置线段样式
  • 深入学习c++之---AVL树
  • 支持零样本和少样本的文本到语音48k star的配音工具:GPT-SoVITS-WebUI
  • 完成ssl不安全警告
  • DQL-6-分页查询
  • Redis的编译安装
  • PVE DDNS IPV6
  • 超详细yolo8/11-detect目标检测全流程概述:配置环境、数据标注、训练、验证/预测、onnx部署(c++/python)详解
  • Altium Designer使用教程 第一章(Altium Designer工程与窗口)
  • ESXi 8.0 SATA硬盘直通
  • python-字符串
  • 量化可复用的UI评审标准(试验稿)
  • OPENPPP2 VDNS 核心域模块深度解析
  • 电源管理芯片(PMIC) 和 电池管理芯片(BMIC)又是什么?ING
  • webpack+vite前端构建工具 -11实战中的配置技巧
  • 合肥工会入会的注意事项和常见问答