先了解下 “平衡因子”:
平衡因子是某节点的左右子树的高度差。如下图,红字数字就是每个节点的平衡因子
再次注意:节点下的红色数字表示的是 当前节点的平衡因子
AVL树的特点:
- 每个节点的平衡因子只可能是
1
、0
、-1
(绝对值<=1,如果超过1
,称之为"失衡") - 每个节点的左右子树高度差不超过1
- 搜索、添加、删除的时间复杂度是
O(logn)
如下图所示:
平衡对比
假设输入数据:35, 37, 34, 56, 25, 62, 57, 9, 74, 32, 94, 80, 75, 100, 16, 82
很明显,AVL树比普通二叉搜索树的高度要小,平衡因子只可能是1
、0
、-1
处理添加节点导致的失衡
LL
-右旋转
(单旋转)
LL
表示的是失衡的左边的左边添加的节点。上图所示,在n
节点添加节点后,导致g节点
失衡了,n节点
在g节点
的左子树的左子树中,用LL
表示,此时将失衡节点g
进行右旋转
就恢复平衡了。如下图所示:
(1):g.left = p.right
,(2):p.right=g
,(3)让p节点
成为这颗子树的根节点
RR
-左旋转
(单旋)
RR
表示的是失衡节点的右边的右边添加的节点。如上图所示,在n
节点再添加一个节点,导致的g
节点失衡,而n节点
在g节点
的右子树的右子树中,用RR
表示,此时将失衡节点g
进行左旋转
就能恢复平衡了,如下图所示:
LR
-RR
左旋转,LL
右旋转(双旋)
LR
-RR
表示的是失衡节点的左边,然后右边添加了一个节点。如上图所示,在n节点
处添加了一个节点,导致了g节点
失衡,而n
节点在g
节点的左子树的右子树中,就用LR
-RR
表示。此时需要先对p节点
进行左旋转,再对g节点
进行右旋转就能恢复平衡了。
RL
-LL
右旋转,RR
左旋转(双旋)
RL
-LL
表示的是在失衡节点的右子树的左子树上的节点添加了一个节点导致的失衡,如上图所示,在n节点
添加一个节点,导致g节点
失衡,此时n节点
在g节点
的右子树节点的左子树中,此时先对p节点
进行右旋转,然后再对g
节点进行左旋转就能恢复平衡了
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。