平衡二叉搜索树的形式多样,且各具特色。比如,伸展树实现简便、无需修改节点 结构、分摊复杂度低,但可惜最坏情况下的单次操作需要n时间,故难以适用于对可靠性和稳定性要求极高的场合。
反之,AVL树尽管可以保证最坏情况下的单次操作速度,但需在节点中嵌入平衡因子等标识;更重要的是,删除操作之后的重平衡可能需做多达logn次旋转,从而频繁地导致全树整体拓扑结构的大幅度变化。
红黑树即是针对后一不足的改进。通过为节点指定颜色,并巧妙地动态调整,红黑树可保证: 在每次插入或删除操作之后的重平衡过程中,全树拓扑结构的更新仅涉及常数个节点。尽管最坏情况下需对多达logn个节点重染色,但就分摊意义而言仅为O(1)个
当然,为此首先需在AVL树“适度平衡”标准的基础上,进一步放宽条件。实际上,红黑树所采用的“适度平衡”标准,可大致表述为:任一节点左、右子树的高度,相差不得超过两倍。
定义与条件
为便于对红黑树的理解、实现与分析,这里不妨下图所示统一地引入n + 1个外部节点,以保证原树中每一节点(现称作内部节点,白色八角形)的左、右孩子均非空—尽管有可能其中之一甚至二者同时是外部节点。
这些外部节点的引入只是假想式的,在具体实现时并 不一定需要兑现为真实的节点。如此扩展之后的便利 之处在于,我们的考查范围只需覆盖真二叉树。
由红、黑两色节点组成的二叉搜索树若满足以下条件,即为红黑树(red-black tree):
- (1) 树根始终为黑色
- (2) 外部节点均为黑色
- (3) 其余节点若为红色,则其孩子节点必为黑色
- (4) 从任一外部节点到根节点的沿途,黑节点的数目相等
条件(1)和(2)意味着红节点均为内部节点,且其父节点及左、右孩子必然存在。
条件(3)意味着红节点之父必为黑色,因此树中任一通路都不含相邻的红节点。
由此可知,在从根节点通往任一节点的沿途,黑节点都不少于红节点。除去根节点本身,沿 途所经黑节点的总数称作该节点的黑深度(black depth)–根节点的黑深度为0,其余依此类推。故条件(4)亦可等效地理解和描述为“所有外部节点的黑深度统一”。
由条件(4)可进一步推知,在从任一节点通往其