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)