红黑树(Red-Black Tree)是一种自平衡二叉查找树,它在进行插入和删除操作时能够保持树的平衡状态,从而保证在最坏情况下基本动态集合操作的时间复杂度为 (O(\log n))。
红黑树主要分为两种类型:
红黑树广泛应用于各种需要高效查找、插入和删除操作的场景,例如:
红黑树的删除操作相对复杂,主要包括以下步骤:
以下是一个简化的红黑树删除操作的伪代码示例:
def delete_node(root, key):
# 查找需要删除的节点
node = find_node(root, key)
if not node:
return root
# 删除节点
if not node.left or not node.right:
child = node.left or node.right
if not child:
child = None
if node.color == BLACK:
root = fix_delete(root, child)
if node.parent:
if node == node.parent.left:
node.parent.left = child
else:
node.parent.right = child
if child:
child.parent = node.parent
else:
successor = minimum(node.right)
node.key = successor.key
delete_node(root, successor.key)
return root
def fix_delete(root, x):
while x != root and x.color == BLACK:
if x == x.parent.left:
s = x.parent.right
if s.color == RED:
s.color = BLACK
x.parent.color = RED
root = rotate_left(root, x.parent)
s = x.parent.right
if s.left.color == BLACK and s.right.color == BLACK:
s.color = RED
x = x.parent
else:
if s.right.color == BLACK:
s.left.color = BLACK
s.color = RED
root = rotate_right(root, s)
s = x.parent.right
s.color = x.parent.color
x.parent.color = BLACK
s.right.color = BLACK
root = rotate_left(root, x.parent)
x = root
else:
# 对称情况
pass
x.color = BLACK
return root
fix_delete
函数进行旋转和重新着色操作,恢复红黑树的性质。通过以上步骤和方法,可以有效地处理红黑树的删除操作,保持树的平衡性和高效性。