AVL 旋转与删除回溯可视化
按“冲突结点 → 孩子 → 孙子”的方向识别插入四型;删除时再看 P 原 BF、处理方式,以及局部高度是否还要继续向上传导。
对应 DS_C6T:平衡二叉树插入旋转 / 删除回溯
插入:四型旋转
插入只会在自下而上的第一处失衡结点附近调整一次。关键是看 A 到 B、B 到 C 两段方向。
判定
旋转
结果
插入失衡四型
从冲突结点开始,连续看“孩子方向、孙子方向”:同侧是单旋,异侧是双旋。
| 类型 | 插入方向 | 处理 |
|---|---|---|
| LL | 左孩子的左子树 | 右单旋(口诀:右旋插到右子之左) |
| RR | 右孩子的右子树 | 左单旋(左旋插入左子之右) |
| LR | 左孩子的右子树 | 先对左孩 RR 左旋,再对冲突结点 LL 右旋 |
| RL | 右孩子的左子树 | 先对右孩 LL 右旋,再对冲突结点 RR 左旋 |
删除:左子树变矮后的回溯
删除可能一路向上传导。这里固定讨论“删除发生在 P 左子树”,逐一观察 P 原 BF、右孩子形态、旋转后高度是否变矮。
P 原 BF
处理
回溯
删除发生在 P 左子树:五种回溯情况
删除后左子树变矮一层,先看 P 原来的 BF;若局部高度变矮,就必须继续向上检查。
| 情况 | P 原 BF | 处理 | 是否继续向上 |
|---|---|---|---|
| 1 | 0 | 不调整(BF 变 −1) | 高度不变,停 |
| 2 | +1 | 不调整(BF 变 0) | 高度变矮,继续 |
| 3 | −1→−2,右孩左子树矮 | RR 旋转 | 高度变矮,继续 |
| 4 | −1→−2,右孩右子树矮 | RL 旋转 | 高度变矮,继续 |
| 5 | −1→−2,右孩左右等高 | RR 或 RL(RR 简单) | 高度不变,停 |
图中 A 为插入回溯时第一个失衡的冲突结点,B 为高子树孩子,C 为决定四型方向的孙子结点;删除表中的 P 表示当前向上回溯检查到的父结点。