红黑树扩张定理
概述
红黑树扩张定理(Red-Black Tree Augmentation Theorem):对红黑树 进行扩张(在每个结点上增加额外的信息字段),只要扩张信息可以在 时间内由子结点的信息计算得到,则所有动态集合操作(插入、删除、旋转)仍可在 时间内完成,且扩张属性在修改后得到正确维护。
定理陈述
形式化陈述
定理(CLRS Theorem 14.1):设 是一棵红黑树,对其每个结点 增加一个额外字段 ,满足以下条件:
- 的值仅依赖于 的信息及其左子结点 和右子结点 的 值,即 可以在 时间内由 和 计算得出
- 可以在 时间内由 的前驱或后继的 值更新
则对 执行插入或删除操作后,可以在 时间内更新所有受影响结点的 值,使得扩张属性在整个树中保持正确。
形式化条件: 其中 是一个 时间可计算的函数。
证明概要
证明思路
证明的关键在于分析红黑树修改操作(插入、删除)对树结构的影响范围,以及旋转操作对扩张信息的影响。
步骤 1:分析旋转操作对扩张信息的影响
红黑树的插入和删除修复过程中,唯一改变树结构的操作是旋转(LEFT-ROTATE 和 RIGHT-ROTATE)。
以 LEFT-ROTATE(T, x) 为例(将结点 的右子结点 旋转上来):
- 旋转仅影响 和 两个结点的子树关系
- 旋转后,需要重新计算 和 的值
- 此外, 和 的祖先结点中,只有 的原父结点 的 值可能需要更新(因为 的某个子结点从 变成了 )
- 更新路径:从 向上到根,每层只需 时间
旋转后更新 值的总时间:(最多更新从旋转点到根的路径上的所有结点)
步骤 2:分析插入操作
插入操作分为两步:
- 标准 BST 插入:将新结点作为叶子插入,然后沿插入路径向上回溯,更新祖先的 值。路径长度为 ,每层 时间,总计
- 插入修复(INSERT-FIXUP):最多执行 次旋转,每次旋转后需要 时间更新 值。但由于旋转是沿路径向上进行的,所有旋转的更新可以合并为一次从最终位置到根的遍历,总时间仍为
步骤 3:分析删除操作
删除操作同样分为两步:
- 标准 BST 删除:删除结点后,从删除位置向上到根更新 值,时间
- 删除修复(DELETE-FIXUP):最多执行 次旋转,与插入类似,所有旋转的 值更新可合并为一次向上遍历,总时间
步骤 4:综合结论
- 旋转不改变红黑树性质(这是红黑树的基本定理),因此旋转后树仍为合法红黑树
- 扩张信息的更新时间与旋转次数线性相关,而旋转次数为
- 因此,扩张后的红黑树的所有动态集合操作仍在 时间内完成
证毕。
关键推论
- 顺序统计树:在红黑树结点中增加子树大小字段 ,可在 时间内支持 OS-SELECT(第 小元素)和 OS-RANK(元素排名)操作。 满足 计算条件
- 区间树:在红黑树结点中增加 字段(以 为根的子树中所有区间的最大右端点),可在 时间内支持区间查找操作
- 通用扩张框架:该定理提供了一个通用的数据结构扩张方法论——只要附加信息满足”局部可计算”条件,就可以在不增加渐近时间复杂度的前提下增强数据结构的功能
应用场景
- 算法导论 Ch14:顺序统计树(OS-TREE)是该定理的直接应用,支持动态集合上的顺序统计查询
- 算法导论 Ch14:区间树(INTERVAL-TREE)利用扩张信息高效查找与给定区间重叠的所有区间
- 文本编辑器:文本编辑器的行号计算可以使用顺序统计树,在 时间内定位任意行
- 计算几何:区间树广泛应用于计算几何中的区间查询问题,如矩形交集检测