这个树,怎么一下就平衡了?(一)

joytrian
发布于 2022-7-6 17:13
浏览
0收藏

 

什么是AVL树
大家好,我是bigsai,好久不见,甚是想念,今天给大家讲讲AVL树。

对于树这种数据结构,想必大家也已经不再陌生,我们简单回顾一下。

在树的种类中,通常分成二叉树和多叉树,我们熟悉的二叉树种类有二叉搜索(排序、查找)树、二叉平衡树、伸展树、红黑树等等。而熟悉的多叉树像B树、字典树都是经典多叉树。

普通的二叉树,我们研究其遍历方式,因为其没啥规则约束查找和插入都很随意所以很少有研究价值。

但是二叉树结构上很有特点:左孩子和右孩子,两个不同方向的孩子对应二进制的01,判断的对错,比较的大小 ,所以根据这个结构所有树左侧节点比父节点小,右侧节点比父节点大,这时候就诞生了二叉搜索(排序)树。二叉搜索(排序)树的一大特点就是查找效率提高了,因为查找一个元素位置或者查看元素是否存在通过每遇到一个节点直接进行比较就可以一步步逼近结果的位置。

但二叉搜索(排序树)有个很大的问题就是当插入节点很有序,很可能成为一棵斜树或者深度很高,那么这样的一个查找效率还是趋近于线性O(n)级别,所以这种情况二叉搜索(排序)树的效率是比较低的。

所以,人们有个期望:对一棵树来说插入节点,小的还在左面,大的还在右面方便查找,但是能不能不要出现那么斜的情况?

这个树,怎么一下就平衡了?(一)-鸿蒙开发者社区

这不,平衡二叉搜索(AVL)树就是这么干的,AVL在插入的时候每次都会旋转自平衡,让整个树一直处于平衡状态,让整个树的查询更加稳定(logN)。我们首先来看一下什么是AVL树:

  • AVL树是带有平衡条件的二叉搜索树,这个平衡条件必须要容易保持,而且要保证它的深度是O(logN)。
  • AVL的左右子树的高度差(平衡因子)不大于1,并且它的每个子树也都是平衡二叉树。
  • 对于平衡二叉树的最小个数,n0=0;n1=1;nk=n(k-1)+n(k-2)+1;(求法可以类比斐波那契)
    难点:AVL是一颗二叉排序树,用什么样的规则或者规律让它能够在复杂度不太高的情况下实现动态平衡呢?

这个树,怎么一下就平衡了?(一)-鸿蒙开发者社区
 
不平衡情况
如果从简单情况模型看,其实四种不平衡情况很简单,分别是RR,LL,RL,LR四种不平衡情况。

这个树,怎么一下就平衡了?(一)-鸿蒙开发者社区

然后将其平衡的结果也很容易(不考虑其附带节点只看结果),将中间大小数值移动最上方,其他相对位置不变即可:

这个树,怎么一下就平衡了?(一)-鸿蒙开发者社区

当然,这个仅仅是针对三个节点情况太过于理想化了,很多时候让你找不平衡的点,或者我们在解决不平衡的时候,我们需要的就是找到第一个不平衡(从底往上)的点将其平衡即可,下面列举两个不平衡的例子:

这个树,怎么一下就平衡了?(一)-鸿蒙开发者社区
 

上述四种不平衡条件情况,可能出现在底部,也可能出现在头,也可能出现在某个中间节点导致不平衡, 而我们只需要研究其首次不平衡点,解决之后整棵树即继续平衡,在具体的处理上我们使用递归的方式解决问题。

 

文章转自公众号:bigsai

标签
已于2022-7-6 17:13:50修改
收藏
回复
举报
回复
    相关推荐