目录
AVL树是最早发明的自平衡二叉搜索树之一
平衡因子(Balance Factor):某结点的左右子树的高度差
AVL树的特点:
每个节点的平衡因子只可能是 1、0、-1(绝对值 ≤ 1,如果超过 1,称之为“失衡”)
每个节点的左右子树高度差不超过 1
搜索、添加、删除的时间复杂度是 O(logn)
AVL树中子树失衡后, 恢复平衡,该子树的高度前后保持一致
AVL树失衡情况分析:
BF: Balance Factor(该节点的平衡因子)
H: Height(节点高度)
原始子树1:
添加节点n
添加节点情况1(平衡):
添加在节点n之后, 该子树仍然处于平衡状态
添加节点情况2(LL):
新添加节点为节点p的左节点, 而p也为节点g的左节点;
在添加节点n之后, 子树失衡; 从节点g开始失衡, 而新添加节点作为g的Left的Left节点, 所以在旋转时可以使用 LL-右旋
LL-右旋转
上面为添加n节点导致g节点失衡, 也有可能是n的左子树中添加节点导致失衡
说明: T0,T1,T2,T3 为n,p,g节点子树; 如果在n的平衡因子为0, p的平衡因子为0, g的平衡因子为1的情况下, 在n的左子树中增加一个节点, 使得n的平衡因子变为1, 则g节点将出现失衡且平衡因子变为2; 可以采用LL-右旋
节点变更操作:
- g.left = p.right
- p.right = g
- 让p成为这棵子树的根节点
- 仍然是一棵二叉搜索树:T0 < n < T1 < p < T2 < g < T3
- 整棵树都达到平衡
注意维护的内容:
- T2、p、g 的 parent 属性
- 先后更新 g、p 的高度
添加节点情况3(LR):
新添加节点为节点p的右节点, 而p为节点g的左节点;
在添加节点n之后, 子树失衡; 从节点g开始失衡, 而新添加节点作为g的Left的Right节点, 所以在旋转时可以使用 LR-RR左旋, LL右旋
RR-左旋:
LL-右旋:
上面为添加n节点导致g节点失衡, 也有可能是n的右子树中添加节点导致失衡
说明: T0,T1,T2,T3 为n,p,g节点子树; 如果在n的平衡因子为0, p的平衡因子为0, g的平衡因子为1的情况下, 在n的左子树中增加一个节点, 使得n的平衡因子变为-1, 则g节点将出现失衡且平衡因子变为2; 可以采用LR-RR左旋, LL右旋
原始子树2:
添加节点
添加节点情况1(平衡):
添加节点n后, 子树仍然平衡
添加节点情况2(RR):
新添加节点为节点p的右节点, 而p也为节点p的右节点;
在添加节点n之后, 子树失衡; 从节点g开始失衡, 而新添加节点作为g的Right的Right节点, 所以在旋转时可以使用RR左旋
RR-左旋
上面为添加n节点导致g节点失衡, 也有可能是n的右子树中添加节点导致失衡
说明: T0,T1,T2,T3 为n,p,g节点子树; 如果在n的平衡因子为0, p的平衡因子为0, g的平衡因子为-1的情况下, 在n的右子树中增加一个节点, 使得n的平衡因子变为-1, 则g节点将出现失衡且平衡因子变为-2; 可以采用RR-左旋
节点变更操作:
- g.right = p.left
- p.left = g
- 让p成为这棵子树的根节点
- 仍然是一棵二叉搜索树:T0 < g < T1 < p < T2 < n < T3
- 整棵树都达到平衡
注意维护的内容:
- T1、p、g 的 parent 属性
- 先后更新 g、p 的高度
添加节点情况3(RL):
新添加节点为节点p的左节点, 而p为节点p的右节点;
在添加节点n之后, 子树失衡; 从节点g开始失衡, 而新添加节点作为g的Right的Left节点, 所以在旋转时可以使用LR-LL右旋,RR左旋
LL-右旋
RR-左旋
上面为添加n节点导致g节点失衡, 也有可能是n的左子树中添加节点导致失衡
说明: T0,T1,T2,T3 为n,p,g节点子树; 如果在n的平衡因子为0, p的平衡因子为0, g的平衡因子为-1的情况下, 在n的左子树中增加一个节点, 使得n的平衡因子变为1, 则g节点将出现失衡且平衡因子变为-2; 可以采用LR-LL右旋,RR左旋
原始子树3
此种情况, 在任何位置插入一个节点, 该子树都将保持平衡