一、前置基础:插入后初始树结构与核心规则
在节点3的左孩子2的右子树位置插入节点2.5后,AVL树的初始结构如下(节点后括号内为树高,未标注则默认后续计算):
5 / \ 3 6 / \ 2 4 \ 2.5核心前提的两个关键规则:
- 二叉搜索树(BST)规则:任意节点的左子树所有节点值均小于该节点值,右子树所有节点值均大于该节点值,即“左小右大”;
- AVL树平衡规则:任意节点的平衡因子BF=左子树高度-右子树高度,需满足|BF|≤1,若不满足则判定为失衡,需通过旋转矫正。
二、失衡判定:找到失衡节点与旋转类型
插入节点2.5后,需从插入节点向上回溯,计算每个节点的树高和平衡因子,找到首个失衡节点,并判定旋转类型。
(一)各节点树高与平衡因子计算
- 节点2.5:无左右子树,树高为1,BF=0(左高0-右高0),无失衡;
- 节点2:左子树高0,右子树高1(节点2.5的高度),树高为2,BF=0-1=-1,|BF|≤1,无失衡;
- 节点4:无左右子树,树高为1,BF=0,无失衡;
- 节点3:左子树高2(节点2的高度),右子树高1(节点4的高度),树高为3,BF=2-1=1,|BF|≤1,无失衡;
- 节点6:无左右子树,树高为1,BF=0,无失衡;
- 节点5:左子树高3(节点3的高度),右子树高1(节点6的高度),树高为4,BF=3-1=2,|BF|>1,判定为失衡,且是回溯过程中首个失衡节点。
(二)旋转类型判定(LR型)
旋转类型由失衡节点及其左、右孩子的平衡因子共同决定,具体判定逻辑如下:
- 失衡节点5的BF=2,说明左子树过高,失衡方向为“左偏重”;
- 失衡节点5的左孩子为节点3,节点3的BF=1,说明节点3的左子树偏高,但结合初始树结构可见,节点3的右子树(节点4)与插入节点2.5形成“左-右”折线结构(3→左2→右2.5,3→右4),本质是左子树的右分支偏高;
- 综上,判定为LR型失衡(左子树的右分支失衡),对应的矫正规则为:先左旋失衡节点的左子树节点(节点3),将折线结构转为直线结构,再右旋失衡节点(节点5),最终恢复树的平衡。
三、旋转操作步骤:分步执行,兼顾平衡与BST规则
LR型旋转需分两步执行,先左旋节点3,再右旋节点5,每一步操作都需严格遵循旋转规则,确保不破坏BST的“左小右大”特性,同时逐步矫正平衡因子。
第一步:左旋节点3(将LR型转为LL型)
左旋操作的核心目的是将节点3的“左-右”折线结构,转为“左-左”直线结构,为后续右旋操作铺垫,具体旋转规则及步骤如下:
- 确定旋转核心节点:以节点3为左旋节点,其右孩子节点4为旋转后的替代节点;
- 节点转移:将节点4的左子树(此处为空)挂载到节点3的右孩子位置,替代原节点4的位置;
- 父子关系调整:将节点3作为节点4的左孩子,完成节点3与节点4的父子关系互换;
- 树高更新:调整节点3和节点4的树高,节点3的树高变为2(左子树节点2的高度1+1),节点4的树高变为3(左子树节点3的高度2+1);
- 位置衔接:将旋转后的节点4,替代原节点3的位置,作为节点5的左孩子。
左旋节点3后的中间态(已转为LL型结构):
5 / \ 4 6 / 3 / 2 \ 2.5此时,节点5的左子树为节点4,形成“左-左”直线结构,LR型失衡已转为LL型失衡,满足后续右旋操作的条件。
第二步:右旋失衡节点5(恢复树的平衡)
右旋操作的核心目的是矫正节点5的左子树过高问题,将节点4晋升为新的子树根节点,使树恢复平衡,具体旋转规则及步骤如下:
- 确定旋转核心节点:以节点5为右旋节点,其左孩子节点4为旋转后的新根节点;
- 节点转移:将节点4的右子树(此处为空)挂载到节点5的左孩子位置,替代原节点4的位置;
- 父子关系调整:将节点5作为节点4的右孩子,完成节点5与节点4的父子关系互换;
- 树高更新:调整节点5和节点4的树高,节点5的树高变为2(右子树节点6的高度1+1),节点4的树高变为3(左子树节点3的高度2、右子树节点5的高度2,取最大值+1);
- 最终衔接:节点4成为该子树的新根节点,保持原有其他节点的父子关系不变(节点3仍为节点4的左孩子,节点6仍为节点5的右孩子)。
四、旋转最终结果与校验
(一)最终平衡AVL树结构
经过“左旋节点3→右旋节点5”两步操作后,最终得到的平衡AVL树结构如下:
4 / \ 3 5 / \ 2 6 \ 2.5(二)双重校验:确保合规与平衡
- BST规则校验(左小右大):
- 节点2的右孩子2.5:2<2.5,符合规则;
- 节点3的左孩子2:2<3,符合规则;
- 节点4的左子树(3、2、2.5)均小于4,右子树(5、6)均大于4,符合规则;
- 节点5的右孩子6:5<6,符合规则;
所有节点均满足“左小右大”,BST规则完全合规。
- AVL平衡规则校验(|BF|≤1):
- 节点2.5:BF=0,节点2:BF=-1,节点3:BF=1,节点6:BF=0,节点5:BF=-1,节点4:BF=0;
- 所有节点的平衡因子绝对值均不超过1,树的平衡状态完全恢复。
五、总结
本次AVL树旋转操作,核心是处理插入节点2.5后出现的LR型失衡,通过“先左旋左子节点、再右旋失衡节点”的两步操作,成功将失衡树矫正为平衡树。整个过程始终遵循BST“左小右大”和AVL“平衡因子≤1”的核心规则,先将折线结构转为直线结构,再通过旋转调整节点位置,最终实现树的平衡。
LR型旋转是AVL树中较复杂的旋转类型,关键在于准确判定失衡类型,分步执行旋转操作,每一步都兼顾节点位置调整和树高更新,确保旋转后既符合BST规则,又能恢复AVL树的平衡特性,本次操作最终得到的树结构即为合规、平衡的最终结果,无需进一步旋转。