“实现应按操作组合和存储层选择。二叉搜索树提供有序字典的基本比较模型,红黑树把查找、插入和删除都约束在最坏 $O(\log n)$;B 树与B+ 树把高分支节点和块访问用于外存,其中 B+ 树…”
形式陈述
红黑树是带颜色的二叉搜索树,也是本页所用最坏高度意义下的平衡搜索树。常用不变量为:根黑;空叶哨兵黑;红节点的孩子均黑;从任一节点到其后代空叶的每条路径含相同黑节点数。于是任一路径长度至多最短路径的两倍,高度不超过
直觉
红黑树用黑节点提供粗粒度的完美平衡骨架,允许红节点在黑层之间插入有限松弛。局部颜色约束保证任意根到叶路径黑节点数相同,并禁止连续红节点,使松弛不会累积成长链:最短路径可以全黑,最长路径至多在每两个黑节点间插一个红节点,因此高度至多约为
例子与边界
插入:先把折线变直,再旋转祖父
用 B/R 表示黑/红,省略的孩子均为黑 NIL。依次插入 10B、左孩子 5R;新 7R 是 5R 的右孩子,出现红红冲突,叔节点是黑 NIL。先对 10B →左 7R →左 5R;再将 7B,左右孩子为 5R,10R。中序键始终为
删除:用兄弟的远侧红孩子消除亏欠
取根 10B,左孩子 5B,右孩子 15B,且 20R。删除黑叶 15B 的远侧孩子 20R 为红,故把 15B、两个孩子 10B,20B,各根到 NIL 路径均有三个黑节点,亏欠消失。若兄弟和两个孩子都黑,则通常先把兄弟染红,把亏欠移给父节点;若兄弟红或仅近侧孩子红,还要先转换情形。这个轨迹只展开一个可核对的删除分支,完整分支见 CLRS §13.4。
红黑树不要求每个节点的左右高度差至多一,那是 AVL 条件。不同教材的根颜色和哨兵约定略有差异,比较黑高时必须固定是否计入当前节点与 NIL。
修复时,旋转保持键的中序关系,颜色更新恢复黑高与红红约束;实现中还要同步维护父指针和根指针。
推论与应用
红黑树建立在二叉搜索树次序和平衡搜索树目标上,给最坏
语言标准库的有序 map/set 常采用红黑树,是因为它在二叉指针 RAM 中兼顾最坏界与更新常数。B 树则以多路节点和占用率适配外存块,把代价写成 I/O 次数。
参考资料
- Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 4th ed., MIT Press, 2022,Chapter 13:§13.2 旋转、§13.3 插入、§13.4 删除。