AI编程辅助工具:5个提升代码可用性的Prompt模板
2026/11/5 12:25:43
在平衡二叉树(AVL 树)中,双旋转和删除操作是维持树结构平衡的关键机制。当插入或删除节点导致树失衡时,需根据具体失衡类型进行相应的旋转调整。
核心逻辑:
时间复杂度:每次插入/删除最多引发 O(log n) 次旋转(实际通常仅需常数次),整体仍保持 O(log n)。
AVL 树通过严格的平衡条件确保查找效率最优,但频繁的旋转增加了插入删除开销,适用于查询远多于修改的场景。后续如红黑树等结构在平衡性与维护成本之间做了折中。
# 示例:模拟 LR 型双旋转(简化示意)defrotate_LR(A):B=A.left C=B.right# 左旋 B 的右子树B.right=C.left C.left=B A.left=C# 右旋 Areturnrotate_right(A)defrotate_right(A):B=A.left A.left=B.right B.right=AreturnB判断一个节点属于 LL、RR、LR 或 RL 失衡类型,关键在于分析失衡节点的平衡因子以及其子树中导致失衡的插入(或删除)位置。以下是具体判断方法:
A (+2) / B (+1) / CA (-2) \ D (-1) \ EA (+2) / B (-1) \ CA (-2) \ D (+1) / C| 类型 | 平衡因子(根) | 子节点平衡因子 | 插入路径 | 旋转方式 |
|---|---|---|---|---|
| LL | +2 | +1 | 左 → 左 | 右旋(单) |
| RR | -2 | -1 | 右 → 右 | 左旋(单) |
| LR | +2 | -1 | 左 → 右 | 先左后右(双) |
| RL | -2 | +1 | 右 → 左 | 先右后左(双) |
⚠️ 注意:删除操作也可能引发上述失衡,判断方式相同,但可能需要沿路径持续调整多个祖先节点。
# 判断失衡类型的伪代码示意defget_balance_type(node):bf=get_balance_factor(node)ifbf==2:left_bf=get_balance_factor(node.left)ifleft_bf==1:return"LL"elifleft_bf==-1:return"LR"elifbf==-2:right_bf=get_balance_factor(node.right)ifright_bf==-1:return"RR"elifright_bf==1:return"RL"return"Balanced"