初探AVL树

简介: 初探AVL树

树在计算机中是一种非常重要的数据结构,而二叉树是每个节点最多有两个子节点,没有子节点的称为叶节点。今天我想总结一些有关AVL树的相关知识。


AVL tree是一个二叉搜索树,从名字我们就可以看出来,其目的是为了提高二叉排序树的搜索性能,其查找数据的时间复杂度为:O(log n),n为节点个数。


平衡因子:左子树高度-右子树高度

形成一个AVL树有以下条件:

·如果树是AVL树,那么它的左右子树都是AVL树。

·左右子树高度差小于1。


AVL树的插入:

我们把距离插入点最近的不平衡点称为X节点,这时候,有四种情况需要考虑:

1.插入前A节点平衡因子为-1,插入节点在X的左子树中,不影响树的平衡。

2.插入前A节点平衡因子为1,插入节点在X的右子树中,不影响树的平衡。

3.插入前A节点平衡因子为-1,插入节点在X的右子树中,影响树的平衡。

4.入前A节点平衡因子为1,插入节点在X的左子树中,影响树的平衡。


image.png

通常把第3种情况称为R型不平衡,也就是上图中所示的不平衡状态。插入在X节点的右子树的右子树上,称为RR型(如上图所示),插入在X节点的右子树的左子树上,称为RL型。同理第4种情况对应的不平衡有LL型和LR型。


平衡的调整:

对于情况RR和LL我称之为外侧插入,可以使用单旋转方式调整解决。

image.png

当类似图一中的RR型插入,单旋转之后结果:

image.png

当类似图二左图的LL型插入,单旋转之后

image.png

情况LR和RL我称之为内侧插入,可以使用双旋转方式调整解决。

image.png

上图经过一次旋转之后:


image.png

再经过一次旋转之后:

image.png

AVL树的删除:


AVL树的删除操作和插入操作相比较起来,肯定是删除操作比较繁琐复杂一些,因为插入只涉及到插入,而删除首先得确定被删除节点,接下来可能涉及到删除之后的重新调整平衡(插入操作),其实调整平衡的操作相当于又一次的插入过程。


在介绍不平衡状态之前,首先统一下称呼,我们把删除发生在左子树,删除之后平衡因子变为-2的情况,称为L型,对应的右子树删除,平衡因子变为2的情况,我们称之为R型。

可能出现需要调整的不平衡情况(L型与R型对称,此处只说L型):

1.L0型的删除,如下图:

image.png

删除前如上图,此处我们是L型,所以删除值为4的节点。删除调整之后,如下图所示:

image.png

由上图可以看出,L0型的调整实际上是对根节点进行一次左旋调整得到,便得到了平衡的AVL树,R0型相对应的做一次右旋操作。

2.L(-1)型的调整:

image.png

删除前如上图所示,删除值为4的节点,删除之后,出现根节点的平衡因子变为-2的情况,所以进行调整,如下图:

image.png

经过一次左旋之后,节点的平衡因子都变成了0。与L(-1)对应的是R1型,R1型需要做一次右旋,此处不再详述。

3.L1型的删除调整:

image.png

L1型的AVL树,如上图所示,此时我们需要删除节点值为4的节点,值为9的节点处出现了平衡因子值为1,所以称L1型,删除调整:

image.png

删除节点值为4的节点之后,第一次旋转,以值为9的节点进行右旋,如上图所示。接下来进行第二次旋转:

image.png

再进行一次左旋,得到如图AVL树。R(-1)和L1是对称的。

以上有关AVL树的知识点,只是一个小小的原理总结,之后哪天心血来潮的话,在博客上更新一下C语言代码实现。

“鸟欲高飞先振翅,人求上进先读书。”—李苦禅

目录
相关文章
|
2月前
|
存储 C++
【C++】AVL树
AVL树是一种自平衡二叉搜索树:它以苏联科学家Georgy Adelson-Velsky和Evgenii Landis的名字命名。
27 2
|
5月前
|
C++
【c++】avl树
【c++】avl树
33 0
|
6月前
AVL 树
AVL 树
48 2
|
6月前
|
C++ 容器
【C++】—— 详解AVL树
【C++】—— 详解AVL树
|
6月前
|
存储 测试技术 C++
C++【AVL树】
C++【AVL树】
73 0
二叉搜索树之AVL树
二叉搜索树之AVL树
|
11月前
|
C++
C++实现AVL树
C++实现AVL树
62 0
|
算法 Java Python
实现AVL树
大家好,我是王有志。今天,我们会用Java和Python分别实现第一个平衡二分搜索树--AVL树。
82 0
实现AVL树
|
算法
平衡二叉树(AVL树)
平衡二叉树(AVL树)
81 0