读书笔记 --- 数据结构与算法分析C语言描述 --- 12.29 --- Chapter4 树 page 80 - 87

4.4 AVL树

对一棵预先排序的树输入数据,一连串的insert操作将花费二次时间,解决这个问题其中一个办法就是有一个称为平衡(balance)的附加结构条件,任何结点深度均不能过深。
AVL(Adelson-Velskii and Landis)树是带有平衡条件的二叉查找树。这个平衡条件固定且容易保持,需保证树的深度为O(log N)。
我们一般将空子树高度定义为-1,加入我们要求结点左右子树拥有相同高度,那么只有理想平衡树(perfectly balanced tree)满二叉树可以满足这个条件,因此这个条件过于严苛。
那么我们对这个条件的放宽之处可以在于其每个结点左子树和右子树高度最多相差1(空子树高度定义为-1)。
这个操作的难度在于,进行插入操作时,我们需要更新通向根结点路径上那些结点的平衡信息,其可能会破坏AVL树特性,于是我们要对这样的情况进行修正,且修改成功才可以算作这一步操作完成。我们称这个过程为旋转(rotation)

假设必须重新平衡的结点为 a a a,高度不平衡出现时,高度差一定为2,而这种不平衡只会出现在以下四种情形中:

  1. a a a的左儿子的左子树进行插入
  2. a a a的右儿子的左子树进行插入
  3. a a a的左儿子的右子树进行插入
  4. a a a的右儿子的右子树进行插入

不难看出,situation1和4关于 a a a镜像对称,2和3关于 a a a镜像对称。
所以我们可以分两部分来讨论这类问题,14为一类,23为一类:

4.4.1 单旋转

上几张图,我觉得这本书给的AVL旋转的图例用的真的很不错,结合了点自己的理解,看完这几张图你还不懂单旋转你可以打我…
在这里插入图片描述
在这里插入图片描述
我之前判断出插入位置是 a a a的左儿子的左节点,于是属于情形1,判断是何种情形是非常重要的!
在这里插入图片描述
④形状发生改变后Y的变化
在这里插入图片描述
1/4情况下就采用想象自己拎着k2抖动的方式,将Y三角转接到k2的左子树上(原来为右子树)。
在这里插入图片描述
镜像对称的情形4:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其实单旋转本身很简单,我还是费了点笔墨来讲,想让大家理解的更透彻一点,这里的情形比较简单,假设这里并不单单是一棵斜树,很多基础不扎实的同学就会非常困惑,那些子树到底放在什么位置上。

4.2.2 双旋转

从情形3 a a a左儿子的右子树被插入开始讲起:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
写到这里莫名觉得其实双旋转比单旋转要简单,因为双旋转确定了k1,k2,k3(上面图的k3 > k2 > k1的大小关系我不再分析了,开一眼便知道了)之后只需要把k2放中间,k1和k3分别放在左边和右边就可以了。套一套格式,把该接的子树接对就大功告成了。

最后,与3镜像对称的情形2,二者旋转后的树形态相同:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这就是我对于旋转的理解,让我们再来回忆一遍步骤:

  1. 当出现不平衡子树时,定位插入位置,确定情形
  2. 熟练的调动出此情形对应的旋转前和旋转后的形态,之后的工作就是往里面套元素

而针对如何记忆旋转前和旋转后的形态我也给出了方法:

旋转形态单旋转双旋转
旋转前形态出现的结点个数k1、k2k1、k2、k3
k1…3拥有的孩子个数22
需要变换树枝方向的结点(单旋转从左往右依次为XYZ,双旋转从左往右以此为ABCD)YB、C
旋转后形态想象着把第二层的结点拎起来抖一抖把中间大小的结点作为根,小的在左大的在右(护法就位)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值