1
先了解下 “平衡因子”:

平衡因子是某节点的左右子树的高度差。如下图,红字数字就是每个节点的平衡因子
image

再次注意:节点下的红色数字表示的是 当前节点的平衡因子
AVL树的特点:
  • 每个节点的平衡因子只可能是10-1(绝对值<=1,如果超过1,称之为"失衡")
  • 每个节点的左右子树高度差不超过1
  • 搜索、添加、删除的时间复杂度是O(logn)

如下图所示:
image

平衡对比

假设输入数据:35, 37, 34, 56, 25, 62, 57, 9, 74, 32, 94, 80, 75, 100, 16, 82
image

很明显,AVL树比普通二叉搜索树的高度要小,平衡因子只可能是10-1
处理添加节点导致的失衡
  • LL-右旋转(单旋转)

image

LL 表示的是失衡的左边的左边添加的节点。上图所示,在n节点添加节点后,导致g节点失衡了,n节点g节点的左子树的左子树中,用LL表示,此时将失衡节点g进行右旋转就恢复平衡了。如下图所示:

image

(1):g.left = p.right,(2):p.right=g,(3)让p节点成为这颗子树的根节点
  • RR-左旋转(单旋)

image

RR表示的是失衡节点的右边的右边添加的节点。如上图所示,在n节点再添加一个节点,导致的g节点失衡,而n节点g节点的右子树的右子树中,用RR表示,此时将失衡节点g进行左旋转就能恢复平衡了,如下图所示:

image

  • LR-RR左旋转,LL右旋转(双旋)

image

LR-RR 表示的是失衡节点的左边,然后右边添加了一个节点。如上图所示,在n节点处添加了一个节点,导致了g节点失衡,而n节点在g节点的左子树的右子树中,就用LR-RR表示。此时需要先对p节点进行左旋转,再对g节点进行右旋转就能恢复平衡了。
image
  • RL-LL右旋转,RR左旋转(双旋)

image

RL-LL表示的是在失衡节点的右子树的左子树上的节点添加了一个节点导致的失衡,如上图所示,在n节点添加一个节点,导致g节点失衡,此时n节点g节点的右子树节点的左子树中,此时先对p节点进行右旋转,然后再对g节点进行左旋转就能恢复平衡了

image


Theday
6 声望0 粉丝