You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode二叉搜索树中第k小元素求解:优化方案与调试记录

解决Kth Smallest Element in a BST的两种解法

最近我在刷LeetCode上的「二叉搜索树中第k小的元素」这道题,这里跟大家分享下我的解题过程和两种不同的解法:

题目要求:给定一棵二叉搜索树(BST),找出其中第k小的元素并返回其值。

1. 初始O(n)时间与空间复杂度解法

一开始我想到的是利用BST的核心特性——中序遍历结果是升序序列。具体思路很直接:

  • 先通过递归中序遍历整棵树,把所有节点的值存入一个数组
  • 因为数组是升序的,直接返回数组中索引为k-1的元素即可

这种解法的时间和空间复杂度都是O(n),毕竟要遍历所有节点还要存储所有值。给大家贴个Python实现的代码:

def kthSmallest(root, k):
    res = []
    def inorder(node):
        if not node:
            return
        inorder(node.left)
        res.append(node.val)
        inorder(node.right)
    inorder(root)
    return res[k-1]

2. 优化后的高效解法

后来我查了些资料,发现可以进一步优化——不用把所有节点值都存起来,而是在中序遍历的过程中实时计数,当计数到k的时候直接返回当前节点的值,这样就能提前终止遍历,省不少空间和时间。

优化后的思路:

  • 同样用中序遍历,但增加一个计数器
  • 每遍历到一个节点(左子树遍历完后),计数器加1
  • 当计数器等于k时,记录当前节点的值并立刻终止所有递归
  • 空间复杂度降到了O(h)(h是树的高度,也就是递归栈的深度),最坏情况时间还是O(n),但平均情况下效率更高

代码实现如下:

def kthSmallest(root, k):
    count = 0
    result = None
    def inorder(node):
        nonlocal count, result
        # 如果已经找到结果,直接返回,避免多余遍历
        if not node or result is not None:
            return
        inorder(node.left)
        count += 1
        if count == k:
            result = node.val
            return
        inorder(node.right)
    inorder(root)
    return result

调试过程

为了彻底搞懂这个优化解法的执行流程,我在代码的几个关键位置设置了断点:

  • 进入左子树递归的行
  • 计数器递增的行
  • 判断计数器是否等于k的分支行
  • 进入右子树递归的行
    通过逐步调试,我清晰看到了中序遍历的顺序,以及当计数到k时如何提前终止递归、返回结果的整个过程,对这个解法的理解更透彻了。

内容的提问来源于stack exchange,提问作者Ganpat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:30:14