平衡二叉搜索树【AVL树】

先了解下 “平衡因子”:

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

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

以下图所示:
imagecode

平衡对比

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

很明显,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

相关文章
相关标签/搜索