二叉树细节可参考:
sheng的学习笔记-二叉树(BST)_coldstarry的博客-优快云博客
定义
平衡二叉树,又称AVL树,用于解决二叉排序树高度不确定的情况,如果二叉排序树的子树间的高度相差太大,就会让二叉排序树操作的时间复杂度升级为O(n),为了避免这一情况,为最坏的情况做准备,就出现了平衡二叉树,使树的高度尽可能的小,其本质还是一棵二叉搜索树。
平衡二叉树的性质:
- 左子树和右子树的高度之差的绝对值小于等于1
- 左子树和右子树也是平衡二叉树
为了方便起见,给树上的每个结点附加一个数字,给出该结点左子树与右子树的高度差,这个数字称为结点的平衡因子(BF)
平衡因子=结点左子树的高度-结点右子树的高度。
左右子树的高度差(平衡因子)< 2,因此平衡二叉树所有结点的平衡因子只能是-1、0、1,如下图,是一个平衡二叉树
等价变换
等价二叉搜索树:若两棵二叉搜索树的中序遍历序列相同,则称它们彼此等价;反之亦然。

旋转调整
由于插入或者删除元素,导致的失衡。最基本的修复手段,通过围绕特定节点的旋转,实现等价前提下的局部拓扑调整。
不一定只有一个结点失去平衡,有可能插入一个结点会让多个结点失衡。这时候找 最小的失衡子树的根节点作为失衡结点。

恢复平衡
那如何去恢复平衡,使得二叉搜索树依然成立为一棵平衡树?先来看平衡调整的四种类型:

举个例子:如第一个,当平衡二叉树为AB时,插入一个C结点,使得失衡了,失衡结点为A,此时因为C结点插入的位置为失衡结点的左孩子的左孩子,所以是LL型,以此类推。
为了恢复平衡,针对每一种都不一样,但目的都是调整为平衡的,且不能违背二叉搜索树的性质:如下图是每种失衡类型的解决方法,每个都不太一样,目的都是一样的,把key的值为中等的变为树的根,最小的放在左孩子,做大的放右孩子,通过这一目的,降低树的高度,也不用死记硬背。

如书上所说,这一操作被称为树的旋转,如LL型被称为右旋,RR型称为左旋,LR型是先左旋,再右旋,RL型先右旋再左旋。
旋转协助理解图
右旋


左旋


LL型调整
如下,在实际情况中,调整的内容可能看起来更复杂,如下方块的表示省略了n个结点,调整的方式如下(右旋):

步骤为:
- B结点带左子树(α和新添加的C结点)一起上升
- A结点成为B的右子树
- 原来的B的右子树成为A的左子树,因为A的左子树是B,上升了,所以空着的
可以看成是A右旋为B的右子树
RR型
LL型和RR型是最简单的几种情况,所以放在了前面。RR型即插入的结点位置在失衡结点的右子树的右子树中,如下图:

调整的步骤和LL的差不多
步骤为:
- B结点和它的右子树(β和新添加的C结点)一起上升
- A结点变为B结点的左子树
- 原来B的左子树α变为A的右子树
可以看成是A左旋至B的左子树
LR型调整
LR型的跳转如下(左旋再右旋):


- 首先让B和它的子树(除了C)左旋至C的左子树,把C为根的树接入A的左子树
- 然后让A右旋,成为C的右子树
其过程就是把中位数的C上升,成为AB的双亲
RL型调整
RL型如下(先右旋再左旋):


- 首先让B和它的子树(除了C)右旋至C的右子树,把C为根的树接入A的右子树
- 然后让A左旋,成为C的左子树
和LR差不多
例题:输入关键字序列(16,3,7,11 ,9,26,18,14,15)给出AVL树
参考答案:



本文详细介绍了AVL树,一种自平衡二叉搜索树。AVL树确保了树的高度平衡,从而保证了查找、插入和删除操作的时间复杂度为O(log n)。文章讲解了平衡二叉树的性质、平衡因子、旋转调整(右旋、左旋、LL型、RR型、LR型、RL型)以及平衡调整策略。此外,还提供了插入操作的代码示例,并讨论了3+4重构方法来恢复平衡。尽管AVL树在操作时可能有较高复杂度,但其高效的性能使其在某些场景下仍具价值。
最低0.47元/天 解锁文章
380

被折叠的 条评论
为什么被折叠?



