数据结构

百科知识2025-04-273

AVL树是一种自平衡的二叉搜索树,得名于其发明者G. M. Adelson-Velsky和E. M. Landis。在AVL树中,任何节点的两个子树的高度差最多为1,因此它也被称为高度平衡树。以下是使用Python实现的简单AVL树代码示例:

定义节点类
class TreeNode:
def init(self, key):
self.key = key
self.left = None
self.right = None
self.height = 1 # 新节点默认高度为1
计算节点高度
def getHeight(node):
if not node:
return 0
return node.height
获取节点的平衡因子
def getBalance(node):
if not node:
return 0
return getHeight(node.left) - getHeight(node.right)
右旋转操作(LL)
def rightRotate(y):
x = y.left
T2 = x.right

# 旋转操作
x.right = y
y.left = T2

# 更新高度
y.height = max(getHeight(y.left), getHeight(y.right)) + 1
x.height = max(getHeight(x.left), getHeight(x.right)) + 1

# 返回新的根节点
return x

左旋转操作(RR)
def leftRotate(x):
y = x.right
T2 = y.left

# 旋转操作
y.left = x
x.right = T2

# 更新高度
x.height = max(getHeight(x.left), getHeight(x.right)) + 1
y.height = max(getHeight(y.left), getHeight(y.right)) + 1

# 返回新的根节点
return y

左右旋转操作(LR)
def leftRightRotate(z):
z.left = leftRotate(z.left)
return rightRotate(z)
右左旋转操作(RL)
def rightLeftRotate(z):
z.right = rightRotate(z.right)
return leftRotate(z)
插入节点
def insert(node, key):

1. 执行正常的BST插入

if not node:
    return TreeNode(key)
if key < node.key:
    node.left = insert(node.left, key)
else:
    node.right = insert(node.right, key)

# 2. 更新这个节点的高度
node.height = 1 + max(getHeight(node.left), getHeight(node.right))

# 3. 获取平衡因子,检查是否失衡
balance = getBalance(node)

# 如果失衡,进行相应的旋转
# 左左情况
if balance > 1 and key < node.left.key:
    return rightRotate(node)
# 右右情况
if balance < -1 and key > node.right.key:
    return leftRotate(node)
# 左右情况
if balance > 1 and key > node.left.key:
    return leftRightRotate(node)
# 右左情况
if balance < -1 and key < node.right.key:
    return rightLeftRotate(node)

return node

中序遍历(可选,用于验证树结构)
def inOrder(root):
if root:
inOrder(root.left)
print(root.key, end=' ')
inOrder(root.right)
示例使用
if name == "main":
root = None
keys = [10, 20, 30, 40, 50, 25]
for key in keys:
root = insert(root, key)
print("Inorder traversal of the constructed AVL tree is")
inOrder(root)