AVL树与红黑树
在数据结构中,AVL树和红黑树是两种常见的自平衡二叉搜索树。它们通过特定的规则保持树的平衡,从而确保在最坏情况下仍能高效地进行插入、删除和查找操作。本文将详细介绍这两种树的基本概念、实现原理及其应用场景。
1. 什么是AVL树?
AVL树是一种高度平衡的二叉搜索树,由Adelson-Velsky和Landis在1962年提出。它的特点是每个节点的左右子树高度差(平衡因子)不超过1。如果插入或删除操作导致树失去平衡,AVL树会通过旋转操作重新平衡。
1.1 AVL树的平衡因子
平衡因子是AVL树中每个节点的左右子树高度差。平衡因子的值只能是-1、0或1。如果某个节点的平衡因子超出这个范围,树就会失去平衡,需要进行旋转操作。
在上面的示例中,节点5的平衡因子为0,因为它的左右子树高度相同。
1.2 AVL树的旋转操作
AVL树通过四种旋转操作来保持平衡:左旋、右旋、左右旋和右左旋。以下是右旋的示例:
def right_rotate(node):
left_child = node.left
node.left = left_child.right
left_child.right = node
return left_child
1.3 AVL树的插入操作
插入新节点后,AVL树会从插入点向上检查每个祖先节点的平衡因子。如果发现不平衡,则进行相应的旋转操作。
def insert(root, key):
if not root:
return Node(key)
elif key < root.key:
root.left = insert(root.left, key)
else:
root.right = insert(root.right, key)
root.height = 1 + max(get_height(root.left), get_height(root.right))
balance = get_balance(root)
# Left Left Case
if balance > 1 and key < root.left.key:
return right_rotate(root)
# Right Right Case
if balance < -1 and key > root.right.key:
return left_rotate(root)
# Left Right Case
if balance > 1 and key > root.left.key:
root.left = left_rotate(root.left)
return right_rotate(root)
# Right Left Case
if balance < -1 and key < root.right.key:
root.right = right_rotate(root.right)
return left_rotate(root)
return root
2. 什么是红黑树?
红黑树是一种自平衡二叉搜索树,它通过颜色标记(红色或黑色)和特定的规则来保持平衡。红黑树的特点是:
- 每个节点是红色或黑色。
- 根节点是黑色。
- 每个叶子节点(NIL节点)是黑色。
- 如果一个节点是红色,则它的两个子节点都是黑色。
- 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。