目录

原始子树1:

添加节点情况1(平衡):

添加节点情况2(LL):

LL-右旋转

添加节点情况3(LR):

RR-左旋:

LL-右旋:

原始子树2:

添加节点情况1(平衡):

添加节点情况2(RR):

RR-左旋

添加节点情况3(RL):

LL-右旋

RR-左旋

原始子树3


AVL树是最早发明的自平衡二叉搜索树之一
平衡因子(Balance Factor):某结点的左右子树的高度差
AVL树的特点:
    每个节点的平衡因子只可能是 1、0、-1(绝对值 ≤ 1,如果超过 1,称之为“失衡”) 
    每个节点的左右子树高度差不超过 1 
    搜索、添加、删除的时间复杂度是 O(logn)

AVL树中子树失衡后, 恢复平衡,该子树的高度前后保持一致


AVL树失衡情况分析:

BF: Balance Factor(该节点的平衡因子)

H: Height(节点高度)

原始子树1:

AVL树

添加节点n

添加节点情况1(平衡):

AVL树

添加在节点n之后, 该子树仍然处于平衡状态


添加节点情况2(LL):

AVL树

新添加节点为节点p的左节点, 而p也为节点g的左节点;

在添加节点n之后, 子树失衡; 从节点g开始失衡, 而新添加节点作为g的Left的Left节点, 所以在旋转时可以使用 LL-右旋

LL-右旋转

AVL树

上面为添加n节点导致g节点失衡, 也有可能是n的左子树中添加节点导致失衡

AVL树

AVL树

说明: T0,T1,T2,T3 为n,p,g节点子树; 如果在n的平衡因子为0, p的平衡因子为0,  g的平衡因子为1的情况下, 在n的左子树中增加一个节点, 使得n的平衡因子变为1, 则g节点将出现失衡且平衡因子变为2; 可以采用LL-右旋

节点变更操作:

  1. g.left = p.right 
  2. p.right = g 
  3. 让p成为这棵子树的根节点 
  4. 仍然是一棵二叉搜索树:T0 < n < T1 < p < T2 < g < T3 
  5. 整棵树都达到平衡

注意维护的内容:

  1. T2、p、g 的 parent 属性 
  2. 先后更新 g、p 的高度

添加节点情况3(LR):

AVL树

新添加节点为节点p的右节点, 而p为节点g的左节点;

在添加节点n之后, 子树失衡; 从节点g开始失衡, 而新添加节点作为g的Left的Right节点, 所以在旋转时可以使用 LR-RR左旋, LL右旋

RR-左旋:

AVL树

LL-右旋:

AVL树

上面为添加n节点导致g节点失衡, 也有可能是n的右子树中添加节点导致失衡

AVL树

AVL树

说明: T0,T1,T2,T3 为n,p,g节点子树; 如果在n的平衡因子为0, p的平衡因子为0,  g的平衡因子为1的情况下, 在n的左子树中增加一个节点, 使得n的平衡因子变为-1, 则g节点将出现失衡且平衡因子变为2; 可以采用LR-RR左旋, LL右旋



原始子树2:

AVL树

添加节点

添加节点情况1(平衡):

AVL树

添加节点n后, 子树仍然平衡


添加节点情况2(RR):

AVL树

新添加节点为节点p的右节点, 而p也为节点p的右节点;

在添加节点n之后, 子树失衡; 从节点g开始失衡, 而新添加节点作为g的Right的Right节点, 所以在旋转时可以使用RR左旋

RR-左旋

AVL树

上面为添加n节点导致g节点失衡, 也有可能是n的右子树中添加节点导致失衡

AVL树

AVL树

说明: T0,T1,T2,T3 为n,p,g节点子树; 如果在n的平衡因子为0, p的平衡因子为0,  g的平衡因子为-1的情况下, 在n的右子树中增加一个节点, 使得n的平衡因子变为-1, 则g节点将出现失衡且平衡因子变为-2; 可以采用RR-左旋

节点变更操作:

  1. g.right = p.left
  2. p.left = g 
  3. 让p成为这棵子树的根节点 
  4. 仍然是一棵二叉搜索树:T0 < g < T1 < p < T2 < n < T3 
  5. 整棵树都达到平衡

注意维护的内容:

  1. T1、p、g 的 parent 属性 
  2. 先后更新 g、p 的高度

添加节点情况3(RL):

AVL树

新添加节点为节点p的左节点, 而p为节点p的右节点;

在添加节点n之后, 子树失衡; 从节点g开始失衡, 而新添加节点作为g的Right的Left节点, 所以在旋转时可以使用LR-LL右旋,RR左旋

LL-右旋

AVL树

RR-左旋

AVL树

上面为添加n节点导致g节点失衡, 也有可能是n的左子树中添加节点导致失衡

AVL树

AVL树

说明: T0,T1,T2,T3 为n,p,g节点子树; 如果在n的平衡因子为0, p的平衡因子为0,  g的平衡因子为-1的情况下, 在n的左子树中增加一个节点, 使得n的平衡因子变为1, 则g节点将出现失衡且平衡因子变为-2; 可以采用LR-LL右旋,RR左旋



原始子树3

AVL树

此种情况, 在任何位置插入一个节点, 该子树都将保持平衡

 

相关文章: