红黑树(RBTree)的概念及实现
红黑树(Red-Black Tree)是一种自平衡二叉查找树,每个节点都遵循一些特定的属性,以确保树的高度近似对数级(O(log n)),从而保证了相关操作的时间复杂度是对数级别的。这些特性使得红黑树在插入、删除、查找操作中能够保持相对高效的性能。
红黑树的特性:
- 节点颜色:每个节点要么是红色,要么是黑色。
- 根节点是黑色:红黑树的根节点始终是黑色。
- 叶节点是黑色:红黑树的所有叶节点(通常是NIL或空节点)都是黑色。
- 红色节点限制:红节点不能有红色子节点,即从每个叶子到根的所有路径上不能有两个连续的红色节点。
- 黑色平衡性:从任一节点到其每个叶子节点的所有路径都包含相同数量的黑色节点。
红黑树的操作:
插入:在红黑树中插入节点后,需要通过"旋转"和"重新着色"来确保树继续保持红黑树的特性。
删除:删除节点时可能会破坏红黑树的特性,也需要通过"旋转"和"重新着色"来恢复。
旋转:旋转是一种用于调整二叉树结构的操作,分为左旋和右旋,用来修正由于插入或删除造成的树的不平衡。
左旋示例:
```伪代码
左旋(节点x):
把x的右子节点y设为当前节点
把y的左子树转移给x的右子树
把x的父节点设为y的父节点
如果x是父节点的左子节点,把y设为父节点的左子节点,否则设为右子节点
把x设为y的左子节点
**右旋是左旋的镜像操作。### 红黑树的实现:
以下是红黑树的一种简单实现,并重点描述插入和修复操作。删除操作类似,但也更为复杂。
class Node:
def init(self, val, color="RED"):
self.val = val
self.color = color
self.left = None
self.right = None
self.parent = None
class RBTree:
def init(self):
self.NIL_LEAF = Node(None, color="BLACK")
self.root = self.NIL_LEAF
def insert(self, val):
new_node = Node(val)
new_node.left = self.NIL_LEAF
new_node.right = self.NIL_LEAF
parent = None
node = self.root
while node != self.NIL_LEAF:
parent = node
if new_node.val < node.val:
node = node.left
else:
node = node.right
new_node.parent = parent
if parent is None:
self.root = new_node
elif new_node.val < parent.val:
parent.left = new_node
else:
parent.right = new_node
self.fix_insert(new_node)
def fix_insert(self, node):
while node != self.root and node.parent.color == "RED":
if node.parent == node.parent.parent.left:
uncle = node.parent.parent.right
if uncle.color == "RED":
uncle.color = "BLACK"
node.parent.color = "BLACK"
node.parent.parent.color = "RED"
node = node.parent.parent
else:
if node == node.parent.right:
node = node.parent
self.left_rotate(node)
node.parent.color = "BLACK"
node.parent.parent.color = "RED"
self.right_rotate(node.parent.parent)
else:
uncle = node.parent.parent.left
if uncle.color == "RED":
uncle.color = "BLACK"
node.parent.color = "BLACK"
node.parent.parent.color = "RED"
node = node.parent.parent
else:
if node == node.parent.left:
node = node.parent
self.right_rotate(node)
node.parent.color = "BLACK"
node.parent.parent.color = "RED"
self.left_rotate(node.parent.parent)
self.root.color = "BLACK"
def left_rotate(self, x):
y = x.right
x.right = y.left
if y.left != self.NIL_LEAF:
y.left.parent = x
y.parent = x.parent
if x.parent is None:
self.root = y
elif x == x.parent.left:
x.parent.left = y
else:
x.parent.right = y
y.left = x
x.parent = y
def right_rotate(self, y):
x = y.left
y.left = x.right
if x.right != self.NIL_LEAF:
x.right.parent = y
x.parent = y.parent
if y.parent is None:
self.root = x
elif y == y.parent.right:
y.parent.right = x
else:
y.parent.left = x
x.right = y
y.parent = x
用法
tree = RBTree()
tree.insert(10)
tree.insert(20)
tree.insert(30)
```
这个实现着重说明了插入和旋转的基本过程。删除操作比较复杂,但也遵循类似的修复机制来确保树始终保持红黑特性。