1. AVL树平衡机制解析
AVL树作为最早发明的自平衡二叉查找树,其核心特性在于通过严格的平衡条件保证操作效率。每个节点的平衡因子(Balance Factor)被定义为左子树高度减去右子树高度,绝对值超过1时触发旋转操作。这种设计确保了树的高度始终维持在O(log n)级别。
1.1 平衡因子的动态变化
当新节点插入到AVL树时,会沿着插入路径向上回溯检查每个祖先节点的平衡状态。假设在节点X处首次发现平衡因子变为+2或-2,说明该节点成为最小不平衡子树(minimal unbalanced subtree)的根节点。此时必须通过旋转操作调整子树结构。
关键细节:回溯检查时只需处理第一个失衡节点,调整后其所有祖先节点会自动恢复平衡
1.2 旋转触发条件分析
旋转操作仅在以下条件同时满足时触发:
- 插入前节点X的平衡因子为±1(若为0则插入后最多变为±1)
- 新节点插入到X的较高子树侧(即平衡因子为+1时插入左子树,或-1时插入右子树)
- 插入导致该侧子树高度增加1,使平衡因子绝对值达到2
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 旋转类型与实现细节
2.1 四种基本旋转场景
根据失衡节点的平衡因子及其子节点的平衡因子,可分为四种旋转类型:
| 失衡情况 | 子节点平衡因子 | 旋转类型 | 示意图特征 |
|---|---|---|---|
| +2 | +1 | 右旋 | 左孩子的左子树过深 |
| +2 | -1 | 左右旋 | 左孩子的右子树过深 |
| -2 | -1 | 左旋 | 右孩子的右子树过深 |
| -2 | +1 | 右左旋 | 右孩子的左子树过深 |
2.2 旋转操作具体实现
以典型的LL型失衡(右旋)为例,具体步骤包括:
- 将失衡节点X的左孩子Y提升为新的根节点
- 将Y的右子树变为X的左子树
- 将X作为Y的右子树
- 更新X和Y的高度及平衡因子
python复制def right_rotate(z):
y = z.left
T3 = y.right
