Skip to content

二叉搜索树

Binary search tree · BST

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

条目类型
模型

形式陈述

二叉搜索树(BST)是每个结点存一个键的二叉树,键取自带全序的集合,并满足有序不变量:对任意结点 x,其左子树中所有键小于 x.key,右子树中所有键大于 x.key。注意约束落在整棵子树而非仅直接孩子上;重复键需由实现另行约定一致的归属策略。在该不变量下,查找、插入与删除都沿一条从根出发的路径进行:每步把目标键与当前结点比较,小则入左、大则入右,时间为 O(h),其中 h 为树高。中序遍历按非降序输出全部键,可对结点数归纳证明。普通 BST 不维护任何形状约束,h 介于 log2nn1 之间,最坏情形退化为链。

直觉

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

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

依次插入 5,3,8,1,435 的左侧,8 入右侧,13 的左侧,43 的右侧。查找 4 沿 534,三次比较结束;中序遍历输出 1,3,4,5,8。删除有两个孩子的结点(如根 5)时,用其中序后继(右子树的最小键 8)覆盖它,再转而删除那个后继——后继至多有一个孩子,问题化归为简单情形。

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

推论与应用

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

节点若保存可由孩子合并的摘要,就进入搜索树增强;保存子树大小并暴露 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。
关系图谱15 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

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