概念介绍
什么是红黑树?
红黑树是一种自平衡二叉搜索树,由德国计算机科学家 Rudolf Bayer 在 1972 年发明。它通过额外的颜色标记和旋转操作来维持树的平衡,确保最坏情况下的基本操作(插入、删除、查找)时间复杂度为 O(log n)。它在 C++ STL 的 map 和 set 底层实现中广泛使用。
每个节点上增加了一个存储位来表示节点的颜色(红色或黑色)。通过对从根节点到任意叶子节点路径上的节点颜色进行约束,红黑树确保了没有一条路径的长度会比其他路径长出两倍,因此它是一种近似平衡的二叉搜索树。
红黑树的基本特性
- 节点颜色属性:每个节点的颜色只能是红色或者黑色。
- 根节点与叶子节点:根节点是黑色的;叶子节点(NIL 节点,即空指针)也是黑色的。
- 红节点规则:如果一个节点是红色的,那么它的两个子节点都是黑色的(不存在连续的红色节点)。
- 黑色高度:对每个节点,从该节点到其所有后代叶子节点的简单路径上,均包含相同数目的黑色节点。
红黑树的效率怎么样?
相比普通的二叉搜索树,红黑树避免了极端情况下退化为链表的问题。假设红黑树中结点数量为 N,最短路径长度为 h,则满足 $2^h - 1 \leq N < 2^{2h} - 1$。由此可推出 $h \approx \log N$,这意味着红黑树增删查改操作的最坏情况,是走最长路径 $2 \times \log N$,所以时间复杂度仍为 O(log N)。
与 AVL 树相比,红黑树的平衡调整操作相对稳定,虽然插入和删除时会进行旋转和变色,但代价相对较小,不会引起树结构的剧烈变化。插入相同数量结点时,红黑树的旋转次数通常更少,因为它对平衡的控制没那么严格。
红黑树如何确保最长路径不超过最短路径的 2 倍?
- 最短路径(全黑路径):由规则 4 可知,极端场景下,最短路径就是全由黑色结点组成的路径。记为
bh(black height)。 - 最长路径(黑红间隔路径):结合规则 2 和 3,极端场景下,最长路径会呈现一黑一红交替的结构,长度为
2*bh。 - 路径长度范围:任意从根到 NIL 结点的路径长度 h,都满足
bh ≤ h ≤ 2*bh,这保证了红黑树的近似平衡特性。
基本操作
一、查找操作
红黑树的查找操作核心逻辑与二叉搜索树高度一致。依托'左小右大'的基本规则,从根节点出发,通过键值的比较,不断向左右子树递归或迭代查找。差异主要体现在平衡维护机制上,但查找操作的'二分比较'形式始终保持简洁高效。
二、插入操作
1. 本质
红黑树的插入是在二叉搜索树的基础上,通过颜色调整和旋转操作来维持树的近似平衡特性。
2. 步骤
在红黑树插入调整逻辑里,我们统一做如下标识:新插入的节点记为 c(current),父节点记为 p(parent),祖父节点记为 g(grandfather),叔叔节点记为 u(uncle)。
情况 1:变色
当新插入节点 c 为红色、父节点 p 为红色,且叔叔节点 u 存在且为红色时:
- 颜色调整:将
p和u染为黑色,g染为红色。 - :把 视为新的'当前节点',继续向上检查调整。


