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

频繁修改的BST中第k小元素查找优化及B+树效率问询

二叉搜索树第K小元素问题与优化方案

原问题解法(递归中序遍历)

我正在解决LeetCode 230:二叉搜索树中第K小的元素问题,以下是用递归中序遍历实现的Python代码,最坏时间复杂度为O(n)(当k=n时需要遍历所有节点):

from typing import Optional, Tuple

# 假设TreeNode定义如下:
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right

def kth_smallest(root: Optional[TreeNode], k: int) -> int:
    def dfs(node: TreeNode, count: int) -> Tuple[int, int]:
        """
        :param node: 当前节点
        :param count: 已访问的节点数量
        :returns: 二元组,包含已访问节点数和最后访问节点的值;若找到第k个节点,直接返回该节点值
        """
        if node.left is not None:
            count, val = dfs(node.left, count)
            if count == k:
                return k, val
        # 计数当前节点
        count += 1
        if count == k or node.right is None:
            return count, node.val
        return dfs(node.right, count)

    assert root is not None
    return dfs(root, 0)[1]

后续优化问题

若BST需要频繁执行插入、删除操作,且需频繁查找第k小元素,该如何优化?

我考虑过使用B+树,它的查找、插入、删除操作时间复杂度为O(log n),范围查询k个元素的时间复杂度为O(k + log n),但有个疑问:在B+树中查找第k小元素能否快于O(n)?同时也希望了解其他符合需求的数据结构。


解决方案与疑问解答

B+树的第k小查询效率

B+树完全可以做到**O(log n)**时间复杂度的第k小查询,核心是给每个内部节点额外存储对应子树的节点数量。查找逻辑如下:

  • 从根节点出发,对比左子树的节点数与k的大小:
    • 若左子树节点数 ≥k,直接进入左子树继续查找;
    • 若左子树节点数 +1 ==k,当前节点即为第k小元素;
    • 若左子树节点数 +1 <k,前往右子树查找第(k - 左子树节点数 -1)小的元素。
      每一步仅遍历树的一层,总时间复杂度为O(log n),远优于O(n)。

其他推荐的数据结构

  • 带size属性的平衡BST(AVL树/红黑树):
    给每个节点维护size字段,表示以该节点为根的子树总节点数。插入、删除操作时同步更新路径上所有节点的size值,查找第k小元素的逻辑与上述B+树一致,时间复杂度O(log n),插入删除也均为O(log n),实现难度低于B+树,适合无需复杂范围查询的场景。
  • 有序链表+跳表:
    用双向链表存储有序元素,搭配跳表做索引。插入、删除可在O(log n)时间定位位置后完成,查找第k小元素通过跳表索引快速定位,时间复杂度O(log n)。不过整体插入删除效率略逊于平衡BST。
  • 树状数组(Fenwick Tree)或线段树:
    若元素取值范围已知且有限,可使用这两种结构。它们能在O(log M)时间内完成插入、删除和第k小查询(M为取值范围大小);若元素范围过大,需先做离散化处理,适合数值型元素且范围可控的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 20:53:22