数据结构与算法之 leetcode 二叉树平衡 AVL 树平衡因子

数据结构与算法阿木 发布于 2025-07-12 7 次阅读


AVL 树平衡因子与二叉树平衡

在数据结构中,二叉树是一种常见的树形结构,它由节点组成,每个节点包含一个数据元素和两个指针,分别指向其左子树和右子树。二叉树在计算机科学中有着广泛的应用,如排序、搜索、遍历等。普通的二叉树在插入和删除操作后可能会变得不平衡,导致性能下降。为了解决这个问题,引入了AVL树,一种自平衡的二叉搜索树。

AVL树通过维护每个节点的平衡因子来实现平衡。平衡因子定义为左子树的高度与右子树的高度之差。如果某个节点的平衡因子绝对值大于1,则该节点是不平衡的。AVL树通过旋转操作来保持平衡,从而保证树的高度始终保持在O(log n)。

本文将围绕AVL树的平衡因子展开,介绍AVL树的基本概念、平衡因子的计算、旋转操作以及相关的代码实现。

AVL树的基本概念

AVL树是一种自平衡的二叉搜索树,它满足以下条件:

1. 每个节点都有一个平衡因子,其值为左子树高度与右子树高度之差。

2. 平衡因子的绝对值不超过1。

3. AVL树是一个二叉搜索树,即对于任意节点,其左子树中的所有节点的值都小于该节点的值,其右子树中的所有节点的值都大于该节点的值。

平衡因子的计算

在AVL树中,每个节点的平衡因子可以通过以下公式计算:

python

def get_balance_factor(node):


if node is None:


return 0


return get_height(node.left) - get_height(node.right)


其中,`get_height(node)` 函数用于获取节点的高度。

旋转操作

AVL树通过四种旋转操作来保持平衡:左旋、右旋、左右旋和右左旋。以下是对这四种旋转操作的简要介绍:

1. 左旋(Left Rotation):当节点的右子树比左子树高时,执行左旋操作。

2. 右旋(Right Rotation):当节点的左子树比右子树高时,执行右旋操作。

3. 左右旋(Left-Right Rotation):当节点的右子树比左子树高,且右子树的左子树比右子树高时,执行左右旋操作。

4. 右左旋(Right-Left Rotation):当节点的左子树比右子树高,且左子树的右子树比左子树高时,执行右左旋操作。

以下是四种旋转操作的代码实现:

python

class TreeNode:


def __init__(self, value):


self.value = value


self.left = None


self.right = None


self.height = 1

def left_rotate(z):


y = z.right


T2 = y.left


y.left = z


z.right = T2


z.height = 1 + max(get_height(z.left), get_height(z.right))


y.height = 1 + max(get_height(y.left), get_height(y.right))


return y

def right_rotate(y):


x = y.left


T2 = x.right


x.right = y


y.left = T2


y.height = 1 + max(get_height(y.left), get_height(y.right))


x.height = 1 + max(get_height(x.left), get_height(x.right))


return x

def left_right_rotate(z):


z.left = left_rotate(z.left)


return right_rotate(z)

def right_left_rotate(y):


y.right = right_rotate(y.right)


return left_rotate(y)


AVL树的插入操作

在AVL树中,插入操作与二叉搜索树的插入操作类似。以下是AVL树插入操作的步骤:

1. 执行二叉搜索树的插入操作。

2. 更新节点的高度。

3. 计算插入节点的平衡因子。

4. 如果平衡因子绝对值大于1,则根据情况执行旋转操作。

以下是AVL树插入操作的代码实现:

python

def insert(root, value):


if not root:


return TreeNode(value)


elif value < root.value:


root.left = insert(root.left, value)


else:


root.right = insert(root.right, value)

root.height = 1 + max(get_height(root.left), get_height(root.right))


balance_factor = get_balance_factor(root)

if balance_factor > 1 and value < root.left.value:


return right_rotate(root)


if balance_factor < -1 and value > root.right.value:


return left_rotate(root)


if balance_factor > 1 and value > root.left.value:


return left_right_rotate(root)


if balance_factor < -1 and value < root.right.value:


return right_left_rotate(root)

return root


总结

本文介绍了AVL树的基本概念、平衡因子的计算、旋转操作以及插入操作的代码实现。AVL树通过维护每个节点的平衡因子来实现平衡,从而保证树的高度始终保持在O(log n)。在实际应用中,AVL树在插入和删除操作后能够快速恢复平衡,提高了二叉搜索树的整体性能。

由于篇幅限制,本文未能详细展开AVL树的删除操作和遍历操作。在实际应用中,读者可以根据需要进一步学习和研究AVL树的其他相关内容。