“给四个有序键 $q 0<q 1<q 2<q 3$,成功查找频率为 $f=(3,1,4,2)$。要构造一棵二叉搜索树,最小化“频率乘访问比较次数”的总和,根上的键算一次比较。”
形式陈述
二叉搜索树(BST)是每个结点存一个键的二叉树,键取自带全序的集合,并满足有序不变量:对任意结点
查找保持“目标若存在,就在当前子树中”:比较相等时成功,小于根键时进入左子树,大于时进入右子树;遇到空链接就失败。插入把失败位置的空链接换成新叶子,沿途比较已保证新键满足所有祖先施加的上下界。
查找、插入和删除的最坏成本均为
直觉
BST 是二分查找的结构化版本:有序数组靠下标计算中点,BST 则把比较路标直接铸进指针结构——每个结点是一块路牌,“小往左、大往右”,一次比较即可丢弃整棵另一侧子树。换来的收益是动态性:数组中段插入要搬移
例子与边界
依次插入
删除叶子时清空父链接;删除只有一个孩子的节点时,让父链接直接指向这个孩子。两个孩子都存在时,取右子树最小节点作为中序后继。它不可能有左孩子,否则便不是最小值;删掉后继时因此至多需要接回一个右孩子。用后继的键及关联值替换待删节点后,左侧仍更小,右侧在移除后继后仍更大。例如删除上述根
一个经典反例说明“只查父子”不够:根
推论与应用
BST 是有序字典的原型:除查找、插入、删除外,还支持最值、前驱后继与范围查询,这是哈希表不承诺的次序信息。平衡搜索树在有序不变量之上追加形状约束,把路径长度升级为最坏
若键集固定、各键的查找频率已知,还可以优化加权比较次数,而不只是最坏树高。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 删除与树高成本。