形式陈述
平衡搜索树(本页聚焦其二叉形态)是在二叉搜索树 公理库 二叉搜索树 Binary search tree · BST 每个结点左子树键小于、右子树键大于该结点键的二叉树。 的有序不变量之上,再维护一条结构不变量的树族。用渐近记号 公理库 渐近记号 Asymptotic notation · Big O notation 忽略常数和低阶项,比较函数在输入趋于无穷时的增长速度。 表述,该不变量保证含 n 个节点时树高
h = O ( log n ) . 由于搜索、插入、删除都沿一条根到叶的路径进行,对数高度直接给出最坏 O ( log n ) 的搜索时间;插入与删除在修改后沿路径回溯,通过旋转、重新着色或局部重构恢复不变量,典型结构的更新同样是最坏 O ( log n ) 。两个代表:AVL 树要求每个节点左右子树高度差至多 1 ,可推出 h ≤ 1.45 log 2 ( n + 2 ) 量级;红黑树 公理库 红黑树 Red-black tree 用节点颜色和路径黑高不变量保持近似平衡的二叉搜索树。 要求红节点的孩子皆为黑且所有根到空叶路径的黑节点数相等,可推出 h ≤ 2 log 2 ( n + 1 ) 。旋转是核心修复原语:它在保持中序序列不变的前提下改变局部形状,因而不破坏搜索序。
直觉
普通二叉搜索树的形状由插入顺序决定,有序到来的键会把它拉成一条链,搜索退化为线性扫描。平衡不变量的作用是让“每次比较都排除大约固定比例的候选”始终成立——树高对数正是这句话的形状化表述。设计上的巧妙在于不变量是局部的:违反只发生在更新路径附近,用常数个局部旋转或染色即可修复,无须全局重建;而“局部约束蕴含全局对数高度”正是每种平衡方案各自需要证明的定理。可以把不变量想成一根张紧的弓弦:每次更新轻微拨动,修复动作立即把形变限制在允许范围内。
图片加载失败 失衡子树与单旋修复
例子与边界
向空树依次插入 1 , 2 , … , n :普通 BST 得到高度 n − 1 的右链;AVL 树则沿途不断触发旋转,例如插入 1 至 7 后得到以 4 为根、高度为 2 的完全平衡树。这一对照说明平衡树的最坏保证不依赖输入顺序的任何随机性。
“平衡”一词必须点明保证类型。AVL 与红黑树给出最坏情形界;随机顺序插入下普通 BST 的期望高度是 O ( log n ) ,却不是最坏保证;伸展树单次操作可达 Θ ( n ) ,提供的是摊还 公理库 摊还分析 Amortized analysis 对操作序列的总成本作上界,而非逐次最坏成本。 O ( log n ) 。面向外存块传输 公理库 外存 / I/O 模型 External-memory model · I/O model · Aggarwal–Vitter model 只计大小为 B 的数据块在容量为 M 的内存与外存之间传输次数的两层存储模型。 的B 树 公理库 B 树 B-tree 以高扇出、有界节点占用率和等深叶层降低外存查找 I/O 的平衡搜索树。 和B+ 树 公理库 B+ 树 B+ tree · B-plus tree 将全部记录保存在等深叶层、以内部路由键和叶链同时支持单键与范围访问的多路搜索树。 采用多路节点与占用率不变量,不是本页二叉旋转模型的“高叉变体”。节点若带父指针、子树大小等增强字段,每次旋转都必须同步更新,否则相关查询会失效。
推论与应用
平衡搜索树实现有序字典 公理库 字典、映射与集合 ADT Dictionary ADT · Map ADT · Set ADT 以有限偏函数统一刻画按键查询、更新和删除的字典、映射与集合接口。 ,支持查找、更新、前驱后继与范围查询。扫描线 公理库 扫描线范式 Sweep-line paradigm · Plane sweep 按事件推进一条虚拟直线,并用动态有序状态维护当前横截面组合关系的计算几何范式。 还可用它维护与当前横截线相交对象的动态次序,使“找几何相邻对象”落到前驱、后继与局部更新。若节点再维护子树摘要,旋转时必须同步重算;这套通用方法由搜索树增强 公理库 搜索树增强定理与方法 Search-tree augmentation 在搜索树节点维护可由局部子树摘要恢复的信息,并证明旋转后仍可常数更新。 说明,维护子树大小的具体接口则形成顺序统计树 公理库 顺序统计树 order-statistic tree · dynamic order statistics 在平衡搜索树中维护子树大小,动态支持按秩选择与键的秩查询。 。增强字段不自动继承复杂度,只有字段能由孩子在 O ( 1 ) 时间合并时,更新才继续保持相应的最坏 O ( log n ) 。
本页的中心是“结构不变量怎样保证高度”,而非罗列全部树族。伸展树 公理库 伸展树 splay tree · 伸展树 每次访问后把目标旋至根,并以势能获得序列敏感摊还界的自调整搜索树。 不保持逐时对数高度,只给操作序列上的摊还 O ( log n ) ;Treap 公理库 Treap 与随机优先级搜索树 treap · randomized search tree 同时满足键的搜索树序和独立随机优先级堆序的随机平衡树。 用随机优先级得到期望对数高度;B 树 公理库 B 树 B-tree 以高扇出、有界节点占用率和等深叶层降低外存查找 I/O 的平衡搜索树。 面向块传输,以多路节点占用率换取 O ( log B n ) 级 I/O。保留旧版本并共享未改子树还属于持久化数据结构 公理库 持久化数据结构 Persistent data structure · Persistence in data structures 更新产生新版本而保留旧版本可访问性,并通过结构共享控制时间与空间的数据结构技术。 问题,需要另计复制与空间。这些结构共享“有序搜索”目标,却不能把保证类型和成本模型互换。
参考资料
Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 4th ed., MIT Press, 2022,Parts I–VI。
Robert E. Tarjan, Data Structures and Network Algorithms, SIAM, 1983,Chs. 1–6。