红黑树(Red-Black Tree)是一种自平衡的二叉查找树(Binary Search Tree,简称BST),它通过在每个节点上增加一个存储位表示节点的颜色(红色或黑色),从而在插入和删除操作时进行适当的调整以保持树的平衡。红黑树的结构和性质使得它在最坏情况下的时间复杂度仍然是 O(log n),因此在很多实际应用中都非常高效。
红黑树的每个节点都有以下属性:
- 颜色(红色或黑色)
- 关键字(或值)
- 左子节点
- 右子节点
- 父节点
红黑树的基本性质:
- 节点是红色或黑色的:每个节点都是红色或黑色的。
- 根节点是黑色的:红黑树的根节点必须是黑色的。
- 所有叶子节点(NIL)都是黑色的:树的所有叶子节点都是黑色的空节点(NIL)。
- 红色节点的子节点是黑色的:红色节点不能有红色的子节点,即红色节点的两个子节点都是黑色的(或NIL)。这保证了从根到叶子的每条路径上不会有两个连续的红色节点。
- 从任一节点到其每个叶子的所有路径都包含相同数量的黑色节点:这确保了没有一条路径比其他路径长出两倍,从而保证了树的平衡性。
红黑树的插入和删除操作相对复杂,需要通过旋转(Rotation)和重新着色(Recoloring)来保持树的平衡。以下是红黑树的插入和删除操作的基本过程:
插入操作
- 普通的二叉查找树插入:将新节点作为红色节点插入到适当的位置,保持二叉查找树的性质。
- 修复红黑树的性质:插入后可能会违反红黑树的性质,需要通过重新着色和旋转来修复。主要通过以下几种情况处理:
- 新节点的父节点是黑色:树仍然是平衡的,不需要修复。
- 新节点的父节点是红色:此时需要修复。通过叔叔节点(父节点的兄弟节点)的颜色和祖父节点进行相应的调整,可能需要进行左旋或右旋操作。
删除操作
- 普通的二叉查找树删除:删除节点并用合适的节点替换,保持二叉查找树的性质。
- 修复红黑树的性质:删除后可能会违反红黑树的性质,需要通过重新着色和旋转来修复。主要通过以下几种情况处理:
- 被删除的节点是红色:直接删除,不影响红黑树的性质。
- 被删除的节点是黑色:通过其兄弟节点的颜色和子节点进行相应的调整,可能需要进行左旋或右旋操作。
以下是红黑树的一些关键操作的示意图:
左旋(Left Rotation)
| |
x y
/ \ / \
α y ---> x γ
/ \ / \
β γ α β
右旋(Right Rotation)
| |
y x
/ \ / \
x γ <--- α y
/ \ / \
α β β γ
插入操作的示例图
- 插入节点导致两个连续的红色节点,需要进行调整。
| |
B B
/ \ / \
R B ---> B R
/ \ /
R B R
删除操作的示例图
- 删除节点导致黑色平衡被破坏,需要进行调整。
| |
B B
/ \ / \
B B ---> B B
/ \ /
B B R
通过以上操作和调整,红黑树能够在保持二叉查找树的特性的同时,保证其高度近似平衡,从而在最坏情况下也能提供高效的插入、删除和查找操作。