Skip to content

模型Model

二叉搜索树

施工中 · 内容逐步修订

Binary search tree · BST

每个结点左子树键小于、右子树键大于该结点键的二叉树。

形式陈述 ​

二叉搜索树(BST)是每个结点存一个键的二叉树,键取自带全序的集合,并满足有序不变量:对任意结点 x,其左子树中所有键小于 x.key,右子树中所有键大于 x.key。约束落在整棵子树而非仅直接孩子上。二叉堆只要求父键不大于孩子键,没有“左边全小、右边全大”的子树范围规则;两者不能共享查找算法。本页采用互异键;字典遇到已有键时更新关联值。若要保存重复项,可在同一结点存计数,或重新定义允许相等的方向及所有操作规则。

查找保持“目标若存在,就在当前子树中”:比较相等时成功,小于根键时进入左子树,大于时进入右子树;遇到空链接就失败。插入把失败位置的空链接换成新叶子,沿途比较已保证新键满足所有祖先施加的上下界。

查找、插入和删除的最坏成本均为 O(h+1),其中高度 h 按边数计,这也覆盖单节点树的 h=0 情形。该界假定一次键比较和指针操作是常数时间;长字符串等键还需计入比较成本。中序遍历按严格递增次序输出本页的互异键,耗时 Θ(n)。普通 BST 不维护形状约束,非空树高介于 ⌊log2⁡n⌋ 与 n−1 之间,最坏退化为链。

直觉

BST 是二分查找的结构化版本:有序数组靠下标计算中点,BST 则把比较路标直接铸进指针结构——每个结点是一块路牌,“小往左、大往右”,一次比较即可丢弃整棵另一侧子树。换来的收益是动态性:数组中段插入要搬移 O(n) 个元素,BST 只需在叶位挂上新结点。效率的全部秘密在形状:每次比较能丢弃的候选比例取决于左右子树的均衡程度,而形状由键的插入顺序决定,这就是同一键集可能对应高效或退化的树的原因。不变量必须覆盖整棵子树,因为查找只依据路径上的比较导航——任何“越界”滞留的键都会被路径永久绕开。

二叉搜索树查找路径示意图
例子与边界

依次插入 5,3,8,1,4:3 入 5 的左侧,8 入右侧,1 入 3 的左侧,4 入 3 的右侧。查找 4 沿 5→3→4,三次比较结束;中序遍历输出 1,3,4,5,8。

删除叶子时清空父链接;删除只有一个孩子的节点时,让父链接直接指向这个孩子。两个孩子都存在时,取右子树最小节点作为中序后继。它不可能有左孩子,否则便不是最小值;删掉后继时因此至多需要接回一个右孩子。用后继的键及关联值替换待删节点后,左侧仍更小,右侧在移除后继后仍更大。例如删除上述根 5,以 8 替换,再删除原来的 8 叶子,得到中序序列 1,3,4,8。若接口公开节点身份,还须区分复制键值与移植节点,不能悄悄改变外部引用的语义。

一个经典反例说明“只查父子”不够:根 5、左孩子 3、3 的右孩子 6——每条父子边局部看都合理(3<5,6>3),但 6 落在 5 的左子树里,违反全局不变量;查找 6 时从 5 起直接右拐,永远碰不到它。另一边界是退化:按 1,2,…,n 递增插入得到高度 n−1 的链,所有操作 O(n);随机顺序插入的期望高度为 O(log⁡n),但这是对插入顺序的期望,不是最坏保证。同一键集合还对应多棵合法 BST——树的形状携带了插入历史的信息。

推论与应用

BST 是有序字典的原型:除查找、插入、删除外,还支持最值、前驱后继与范围查询,这是哈希表不承诺的次序信息。平衡搜索树在有序不变量之上追加形状约束,把路径长度升级为最坏 O(log⁡n);未经平衡的本页结构仍只有 O(h+1),不能借用该保证。

若键集固定、各键的查找频率已知,还可以优化加权比较次数,而不只是最坏树高。Knuth 区间优化用相邻区间的最优根夹住当前根,在二次时间构造最优搜索树;频率模型、平局规则与动态更新的接口都要分别说明。

节点若保存可由孩子合并的摘要,就进入搜索树增强;保存子树大小并暴露 select/rank 接口的具体结构是顺序统计树。伸展树用访问后的旋转获得摊还界,Treap用随机优先级获得期望界,它们都保留 BST 的中序不变量,却给形状加入不同的概率或序列保证。外存场景的多路 B 树再改用块占用不变量,不是二叉指针模型的直接延伸。

参考资料
  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 4th ed., MIT Press, 2022,Chs. 12–13, binary search trees and balancing context。
  • Robert Sedgewick and Kevin Wayne, Algorithms, 4th ed., Addison-Wesley, 2011,§3.2 Binary Search Trees:查找不变量、Hibbard 删除与树高成本。
关系图谱21 个相邻概念 · 5 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
分类位置
类型化关系