数据结构之树(3)——二叉平衡树(AVL)

AVL树

AVL树即是平衡二叉树,是一种特殊的二叉排序树。

它的左右子树都是平衡二叉树,并且左右子树的高度之差的绝对值不超过1

注意:平衡二叉树就是一棵二叉排序树,是二叉排序树的改进,提高了查找效率。

AVL树的插入结点根二叉排序树是一样的,都是遵循左小右大的原则。

但在插入过程中,每插入一个新的结点,就需要检查新结点的插入是否使得原平衡二叉树失去平衡,如果失去平衡则需要进行平衡调整。

为了判断一棵二叉排序树是否是平衡二叉树,引进了平衡因子的概念。平衡因子是针对树中的结点来说的,一个结点的平衡因子为其左子树的高度减去右子树高度的差。对于平衡二叉树,树中的所有结点的平衡因子的取值只能是-1、0、1三个值。

数据结构之树(3)——二叉平衡树(AVL)_第1张图片

当一棵平衡二叉树变成一棵不平衡树后,会进行平衡调整,平衡调整有4种情况:LL(左左)、RR(右右)、LR(左右)、RL(右左)

在进行平衡调整之前,需要知道一个最小平衡子树的概念。

假定向平衡二叉树中插入一个新结点后破坏了平衡二叉树的平衡性,则首先要找出插入新结点后失去平衡的最小子树,然后再调整这棵子树,使之成为平衡子树。值得注意的是,当失去平衡的最小子树被调整为平衡子树后,无须调整原有其他所有的不平衡子树,整个二叉排序树就会成为一棵平衡二叉树。所谓失去平衡的最小子树是以距离插入结点最近,且以平衡因子绝对值大于1的结点作为根的子树,又称为最小不平衡子树

例如:

数据结构之树(3)——二叉平衡树(AVL)_第2张图片

数据结构之树(3)——二叉平衡树(AVL)_第3张图片

注意:平衡调整的4种情况LL、RR、LR和RL,并不是对调整过程的描述,而是对不平衡状态的描述。

如LL(左左)调整,即新插入结点落在最小不平衡子树根结点的左(L)孩子的左(L)子树上,对这种不平衡状态的调整称之为LL调整。

数据结构之树(3)——二叉平衡树(AVL)_第4张图片

如LR(左右)调整,即新插入结点落在最小不平衡子树根结点的左(L)孩子的右(R)子树上,对这种不平衡状态进行调整称之为LR调整。

数据结构之树(3)——二叉平衡树(AVL)_第5张图片

其他的RR和RL都是这样的。

上面叙述的是发生二叉树不平衡的情况,下面讲解怎么处理不平衡,即进行平衡调整的方法。

在此之前,还需要说下左旋转和右旋转:

左旋转:逆时针旋转AVL树的两个结点X和Y,使得父结点被自己的右孩子取代,而自己成为自己的左孩子。

数据结构之树(3)——二叉平衡树(AVL)_第6张图片

这是一个很奇妙的故事:父亲被自己的右孩子逼下位,右孩子成功上位,为了弥补父亲缺少右孩子的遗憾,把自己的左孩子给了父亲。

右旋转:顺时针旋转AVL树的两个结点X和Y,使得父结点被自己的左孩子取代,而自己成为自己的右孩子。

数据结构之树(3)——二叉平衡树(AVL)_第7张图片

这也是一个很奇妙的故事:父亲被自己的左孩子逼下位,左孩子成功上位,为了弥补父亲缺少左孩子的遗憾,把自己的右孩子给了父亲。

  • LL调整,也叫右单旋转调整

抽象图详解:

  • ①其中A、B、C是最小不平衡子树的三个结点,而三角形代表这些结点下的子树,其中A结点的平衡因子为2,表示该二叉树已经不平衡。
  • ②把C结点及其子树当作一个整体来处理,同时也暂时表示以C结点为根结点的子树是平衡的然后,然后用三角形C代替,抽象表示B的左孩子。
  • ③然后就成了右旋转的标准形式,根据上面的右旋转方法来调整平衡。
  • ④成功调整平衡,将三角形C替换回来,检查平衡因子,发现调整平衡成功。

数据结构之树(3)——二叉平衡树(AVL)_第8张图片

结点实际操作如图:

数据结构之树(3)——二叉平衡树(AVL)_第9张图片

  • RR调整,也叫左单旋转调整

抽象图详解:

  • ①其中A、B、C是最小不平衡子树的三个结点,而三角形代表这些结点下的子树,其中A结点的平衡因子为-2,表示该二叉树已经不平衡。
  • ②把C结点及其子树当作一个整体来处理,同时也暂时表示以C结点为根结点的子树是平衡的然后,然后用三角形C代替,抽象表示B的右孩子。
  • ③然后就成了左旋转的标准形式,根据上面的左旋转方法来调整平衡。
  • ④成功调整平衡,将三角形C替换回来,检查平衡因子,发现调整平衡成功。

数据结构之树(3)——二叉平衡树(AVL)_第10张图片

结点实际操作如下图:

 

数据结构之树(3)——二叉平衡树(AVL)_第11张图片

  • LR调整,也叫先左后右双旋转调整

抽象图详解:

  • ①表示LR调整的情况,其中A、B、C是最小不平衡子树的三个结点,而三角形代表这些结点下的子树,其中A结点的平衡因子为2,表示该二叉树已经不平衡。
  • ②把绿色框内的当成一个整体来处理,即三角形BC。
  • ③把三角形1、2、3当成一个整体,暂时不进行处理,设为三角形BC。
  • ④对三角形BC内的情况进行处理,即左旋转,旋转完成。
  • ⑤恢复三角形BC旋转后的内容,即融合④的结果。
  • ⑥把绿色框内的当成一个整体,就是右旋转的情况,设为三角形B。
  • ⑦进行右旋转,旋转完成。
  • ⑧将三角形B的内容恢复为⑥种的绿色框内容,完成平衡调整。

结点实际操作如图:

数据结构之树(3)——二叉平衡树(AVL)_第12张图片

  • RL调整,也叫先右后左双旋转调整

抽象图详解:

  • ①表示RL调整的情况,其中A、B、C是最小不平衡子树的三个结点,而三角形代表这些结点下的子树,其中A结点的平衡因子为-2,表示该二叉树已经不平衡。
  • ②把绿色框内的当成一个整体来处理,即三角形BC。
  • ③把三角形2、3、4当成一个整体,暂时不进行处理,设为三角形BC。
  • ④对三角形BC内的情况进行处理,即右旋转,旋转完成。
  • ⑤恢复③种三角形BC旋转后的内容,即融合④的结果。
  • ⑥把绿色框内的当成一个整体,就是左旋转的情况,设为三角形B。
  • ⑦进行左旋转,旋转完成。
  • ⑧将三角形B的内容恢复为⑥种的绿色框内容,完成平衡调整。

数据结构之树(3)——二叉平衡树(AVL)_第13张图片

二叉平衡树删除结点跟二叉排序树删除结点是用同样方法处理的,不过删除后要考虑树是否平衡的问题,如果遇到失衡问题同样可以考虑用上面四种情况进行解决。

 

参考链接:

  • 漫画:什么是AVL树?(修订版)

你可能感兴趣的:(数据结构,AVL,二叉平衡树)