avl树双旋转需严格按bf值触发:当cur->bf=±2且子节点bf符号相反时执行lr/rl旋转,旋转后须依c的原bf值分支更新a、b的bf及三节点height,否则破坏o(log n)性质。

实现 AVL 树在插入或删除后触发双旋转(先左后右、先右后左)的完整恢复逻辑,必须严格依据节点平衡因子变化路径推导旋转类型,并在代码中嵌入可验证的数学条件判断——比如 BF 值突变为 ±2 且子节点 BF 符号相反时才触发双旋。
识别需双旋转的失衡模式
从插入/删除引发的最深失衡节点 【cur】 开始向上回溯,找到第一个平衡因子(BF)绝对值等于 2 的节点;该节点即为旋转根节点。
检查其较高子树的根节点(即 BF 绝对值为 1 或 0 的子节点)的 BF 值:若 【cur->left->bf == 1 且 cur->bf == -2】,或 【cur->right->bf == -1 且 cur->bf == 2】,则必须执行双旋转而非单旋转。
此时若跳过子节点 BF 符号判断直接单旋,会导致新树 BF 全面错乱,后续所有插入都将无法维持 O(log n) 高度。
右-左双旋转(RL)的手动分解与编码实现
方法一:分步拆解(推荐调试用)
第一步:对失衡节点 cur 的右子节点 cur->right 执行右旋 → 得到临时子树 T
第二步:将 cur 的右指针指向 T,再对 cur 整体执行左旋 → 完成 RL 恢复
注意:右旋操作必须先更新 T 的 bf,再修正 cur->right->bf 和 cur->bf;顺序颠倒会导致 bf 计算链断裂。关键校验点是旋转后 cur->bf 必须为 0、-1 或 1,且不能出现 ±2。
方法二:原子化函数封装
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
定义 rl_rotate(Node*& cur),内部调用 single_right_rotate(cur->right) → single_left_rotate(cur);两调用间必须重置中间节点的 height 和 bf,否则 height 差值失效,bf 推导失去数学基础。
左-右双旋转(LR)的 BF 数学推导与赋值逻辑
设失衡节点为 A,A->left 为 B,B->right 为 C。LR 旋转后,新子树根为 C。
① 旋转前:A->bf = 2,B->bf = -1(必要前提)
② 旋转后三节点 BF 必须满足:
— 若 C->bf == 0,则 A->bf = 0,B->bf = 0
— 若 C->bf == 1,则 A->bf = -1,B->bf = 0
— 若 C->bf == -1,则 A->bf = 0,B->bf = 1
这组关系由高度差定义严格导出:bf(x) = height(x->right) − height(x->left),不可硬编码为固定值。代码中必须根据 C 原 bf 值分支赋值,否则破坏 AVL 数学闭环。
在 insert 调用链中嵌入双旋触发判定
insert_recursive 返回 void,但通过引用参数传出是否引起高度变更;每次递归返回时检查子树高度差,一旦发现 cur->bf == 2 && cur->left->bf == -1,立即调用 lr_rotate(cur)。
lr_rotate 函数内第一行必须写:Node* B = cur->left; Node* C = B->right; —— 否则 C 可能为空指针,导致段错误。
完成旋转后,必须同步更新 cur、B、C 三节点的 height 字段:height = max(height(left), height(right)) + 1;漏掉任一节点 height 更新,下一次 BF 计算即失效。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










