1. AVL树的自平衡机制解析
AVL树作为计算机科学中最早发明的自平衡二叉查找树,其核心在于通过旋转操作维护树的平衡性。当我们在AVL树中插入或删除节点时,可能会破坏树的平衡状态,此时需要通过特定的旋转操作来恢复平衡。
1.1 平衡因子的定义与作用
平衡因子(Balance Factor)是AVL树中每个节点的关键属性,它表示该节点左右子树高度之差。具体计算公式为:
code复制平衡因子 = 左子树高度 - 右子树高度
在AVL树中,我们要求每个节点的平衡因子绝对值不超过1(即-1、0或+1)。当某个节点的平衡因子绝对值超过1时,我们就说这个节点"失衡"了,需要进行旋转调整。
注意:平衡因子的计算是基于子树的高度,而不是节点数量。高度定义为从该节点到其最远叶子节点的路径长度。
1.2 失衡检测与旋转触发条件
当插入或删除节点后,我们需要从操作位置开始向上回溯检查每个祖先节点的平衡状态。具体流程如下:
- 从插入/删除位置开始向上遍历父节点
- 对每个访问的节点重新计算平衡因子
- 当发现某个节点的平衡因子绝对值变为2时(即从±1变为±2),停止回溯
- 对该节点进行相应的旋转操作
这里有一个关键点:我们只需要处理第一个发现的失衡节点(即从操作位置向上第一个平衡因子绝对值超过1的节点),因为修复这个节点的失衡通常会同时修复其上所有祖先节点的平衡状态。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 旋转操作的四种基本类型
AVL树通过四种基本旋转操作来恢复平衡:左旋、右旋、左右旋和右左旋。选择哪种旋转取决于失衡节点及其子节点的平衡因子状态。
2.1 右旋(LL旋转)
当失衡节点的平衡因子为+2,且其左子节点的平衡因子为+1时,需要进行右旋操作。这种情况通常被称为"左左情况"(LL)。
python复制def right_rotate(node):
left_child = node.left
node.left = left_child.right
left_child.right = node
# 更新高度和平衡因子
update_height(node)
update_height(left_child)
return left_child
