关于数据结构与算法中的平衡二叉树(AVL)的快速记忆

目录

前言

起源

定义

失衡二叉树如何恢复平衡

为什么会失衡

如何恢复平衡

恢复平衡的原则

恢复平衡的策略

结束语


前言

今天是坚持写博客的第九天,继续加油!

我们今天来讲讲平衡二叉树。


起源

平衡二叉树起源于对二叉搜索树性能问题的优化。二叉搜索树是一种特殊的二叉树,其中每个节点的值都大于其左子树中任何一个节点的值,并且小于其右子树中任何一个节点的值,说人话就是父节点大于左孩子,小于右孩子,左孩子又大于它的左孩子,小于右孩子……这种结构允许快速的查找、插入和删除等操作,理想情况下,这些操作的时间复杂度可以达到O(log n),其中n是树中节点的数量。

但在最坏的情况下,如果二叉搜索树的数据插入顺序是有序的或者逆序的,树会退化成一个链状结构,这时二叉搜索树的性能降低到O(n),相当于一个无序列表的性能,失去了其高效查询的优势。

因此平衡二叉树就诞生了。在每次插入或删除节点后,都会通过一系列旋转操作来重新平衡树,确保任何节点的两个子树的高度差最多为1。这种平衡性保证了树的高度大致保持在log n级别,从而确保了高效的查找、插入和删除操作。

如下图就是一个典型的平衡二叉树:

寄术博主的日常画的很难讲的图片出现了 


定义

平衡二叉树又称AVL树(Adelson-elskii and Landis).
一棵平衡二叉树或者是空树,或者是具有下列性质的二叉排序树:

  1. 左子树与右子树的高度之差的绝对值小于等于1,
  2. 左子树和右子树也是平衡二叉排序树。

在平衡二叉树中有一个定义非常关键,就是平衡因子,即上面提到的左子树与右子树的高度之差。平衡因子=结点左子树的高度-结点右子树的高度。比如我们使用上面的平衡二叉树作为例子,结点60的平衡因子=左子树高度2-右子树高度1=1.


失衡二叉树如何恢复平衡

为什么会失衡

因为如果我们在一个平衡二叉树上插入一个结点, 那他可能就会造成失衡(例如平衡因子为2)。因此我们需要通操作让她恢复平衡,

例如我们在这样一颗平衡树中插入结点65,那结点60的平衡因子就会被打破,平衡二叉树就会失衡,变成图二的样子:

如何恢复平衡?且听我娓娓道来。请原谅寄术博主的画工


如何恢复平衡

常见的失衡的平衡二叉树有以下几种:

  1. 插入结点在失衡节点的左子树的左子树上
  2. 插入结点在失衡节点的左子树的右子树上
  3. 插入结点在失衡节点的右子树的左子树上
  4. 插入结点在失衡节点的右子树的右子树上

是不是套娃太重,有点懵?我们上图:

恢复平衡的原则

我们在调整失衡二叉树的时候,需要遵循以下原则:

  1. 如果失衡节点超过一个,那我们就优先选择最小失衡子树的根节点。
  2. 降低树的高度
  3. 保持二叉排序树的性质

其中第三点尤为重要,这样可以确保恢复平衡后的二叉树的唯一性,否则无论如何“转”都有多种情况。

恢复平衡的策略

我们以失衡二叉树的第一种情况为例,加入我们有如下图一样的一个失衡二叉树:

我们如何调整?思路如下,图解会放在思路后面:

  1. 此时这棵树必定为失衡二叉树,由于左子树失衡,我们首先带着左子树B和它的左子树阿尔法上升,贝塔留在原地“待命”。
  2. 将A结点及其子树作为B子树的右子树,贝塔继续待命。
  3. 将B原来的右子树贝塔作为A的左子树。
  4. 此时通过平衡因子验证是否已经完成恢复


此时我们第一种失衡的情况已经完成恢复。

其他几种情况也可以类比完成。


结束语

平衡二叉树作为二叉树中提升效率的关键先生,是数据结构与算法当中不可或缺的一部分。今天我们对AVL树的讲解就到这里,如果本文章对您有所帮助,希望您可以点一个赞或关注,这对我真的很重要,谢谢!

  • 33
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值