平衡二叉树的平衡因子只会有三种值:-1,0,1。 在平衡二叉树插入或者删除一个结点时,很可能破坏其平衡性,为了调整平衡性,因此需要执行旋转。

平衡因子

平衡因子:某结点左右子树的高度差值
【例】如下图

一个结点的平衡因子=该节点左子树深度-该节点右子树深度
于是:
5的结点平衡因子就是 3 - 2 = 1;
2的结点平衡因子就是 1 - 2 = -1;
4的结点平衡因子就是 1 - 0 = 1;
6的结点平衡因子就是 0 - 1 = -1;
叶子结点没有子树,于是叶子结点的平衡因子都是0


平衡二叉树和不平衡的二叉树的对比:

对于平衡二叉树产生了不平衡之后,如何进行平衡调整?
注意:每次都是按照最小不平衡子树进行调整

LL平衡旋转

当在某个结点的左孩子的左子树新插入了结点,需要进行LL平衡旋转,向右旋

如下图:(方框部分是对子树进行了抽象封装,同时这些子树的高度都是H,并且假设它们都是平衡的,下同)


上图说明:
(a) 初始状态是平衡状态,A,B结点的平衡因子分别是1,0;并且它们之间有一个潜在的大小关系:BL < B < BR < A < AR
(b) B的左子树插入了一个结点,导致A结点的平衡因子变为2,此时不满足二叉平衡树的要求(平衡因子只能是-1,0,1)
由于A结点的平衡因子为2,说明左边大,右边小,为了保持平衡,需要右旋。


执行右旋后,B结点的右子树会变成A结点的左子树,使得仍然满足大小关系:BL < B < BR < A < AR

*注意二叉排序树的特性:左子树结点值 < 根结点值 < 右子树结点值

( c ) 由于B的左子树增加了一个结点,使得高度加了1,此时B的平衡因子为0,又重新变成了平衡二叉树。

【例】如下图

插入9之后,变得不平衡,找到最小不平衡子树,由于不平衡发生在15结点的左孩子的左子树,于是需要对15的左孩子10执行LL平衡旋转,即向右旋,10替换15的位置,将15变成10的右孩子

RR平衡旋转

当在某个结点的右孩子的右子树插入了结点,需要进行RR平衡旋转,向左旋

B结点左旋到A结点的位置,为保证各节点大小顺序不变,B的左子树变为A的右子树

【例】

如上图所示,插入结点90后,产生了不平衡,于是先找到最小不平衡子树

由于不平衡发生在以66为根结点的右孩子的右子树,因此需要执行RR平衡旋转,即就是向左旋。

让不平衡结点66的右孩子68左旋,68替代66,为保证各结点的大小顺序不发生改变,将68的左孩子变成你66的右孩子。

LR平衡旋转

当在某个结点的左孩子的右子树插入了结点,需要进行LR平衡旋转,先向左旋,再向右旋


如上图所示,先将A结点的左孩子B的右子树的根结点C向左上旋转提升到B结点的位置,将C的左子树变为B的右子树;

然后再把C结点向右旋转提升到A结点的位置,将C的右子树变为A的左子树

调整过后需要满足:BL<B<CL<C<CR<A<AR
【例1】

如上图所示,插入结点 57之后发生了不平衡,

最小不平衡子树为整颗树,发生不平衡的位置是 66 结点的左孩子 50 的右子树,因此需要执行LR平衡操作,针对 50 的右结点 60 先左旋,60 替代 50,50成为 60 的左孩子,原本可以60的左子树成为 50 的右子树


接下来右旋 ,60 代替 66 ,将 60 的右孩子变为66的左孩子

[例2]

最小不平衡子树如虚线框所示,发生在75这一结点,原因是75的左孩子38插入了右结点,因此执行LR旋转 ,找到 75 左孩子38的第一个右孩子 51,先左旋,51 提换 38,51没有子树不用为子树重新定位 ,然后 51 再右旋,51 替换 75,75 成为51的右孩子

RL平衡旋转

当在某个结点的右孩子的左子树插入了结点,需要进行RL平衡旋转,先向右旋再向左旋

先将A结点的右孩子B的左子树的根结点C向右旋转提升到B结点的位置,将C的右子树变为B的左子树;

然后再把C结点左旋提升到A结点的位置,将C的左子树变为A的右子树;

调整过后需要满足:AL<A<CL<C<CR<B<BR
【例】

插入结点 63 后,最小不平衡树仍然是整颗树,不平衡情况发生在50的右孩子的左子树 , 因此需要执行RL平衡旋转


先对结点 66 先进行右旋,66 替换 68,66的右孩子 67 成为 68 的左孩子;
然后对 66 左旋 ,66 替换 50,66 的左孩子成为 50 的右孩子;
熟练之后可以一步到位,如上图所示,66 的左子树直接给 50,右孩子直接给68, 66 往上提

为什么要按“最小不平衡子树”进行调整?

插入操作导致某个子树高度+1,当调整这个不平衡子树后,高度恢复为原来的高度后,重新恢复到平衡,其它祖先结点也自然恢复到了平衡

数据结构——快速掌握LL旋转LR旋转以及RL旋转RR旋转相关推荐

  1. 【数据结构笔记12】平衡二叉树,AVL树,RR旋转/LL旋转/LR旋转/RL旋转,AVL树插入的代码实现

    本次笔记内容: 4.2.1 什么是平衡二叉树 4.2.2 平衡二叉树的调整 文章目录 什么是平衡二叉树 评价查找长度ASL 平衡因子(Balance Factor,BF) 平衡二叉树(Balanced ...

  2. 二叉平衡(AVL)树中的 LL旋转、RR旋转、LR旋转、RL旋转 的详细解释

    文章目录 前言 一.旋转的分类 1.LL失衡 2.RR失衡 3.LR失衡 4.RL失衡 二.实现LL平衡旋转 三.实现RR平衡旋转 四.实现LR平衡旋转 五.实现RL平衡旋转 前言 我们知道在二叉平衡 ...

  3. 数据结构快速盘点 - 非线性结构

    PS:为了更好的阅读体验,推荐阅读原文,到我的博客中阅读. 那么有了线性结构,我们为什么还需要非线性结构呢? 答案是为了高效地兼顾静态操作和动态操作.大家可以对照各种数据结构的各种操作的复杂度来直观感 ...

  4. cad旋转命令_如何将CAD图形旋转至水平位置?

    在我们绘制CAD家装制图的时候,有些时候需要将CAD图纸里的图形旋转到不同的位置,那怎么能够确定图形一定旋转到了水平的位置呢?本期,就来和小编一起看看旋转CAD图形到水平位置的操作步骤吧! 步骤一.我 ...

  5. 数据结构:AVL树的平衡调整——LL,LR,RL,RR

    AVL树的全称是平衡搜索二叉树,本质上也是一个二叉搜索树(BST),满足BST树的所有性质. 但是我们在使用二叉搜索树的时候,我们知道通常情况在BST中搜索一个节点的时间复杂度是O(lgn). 最坏的 ...

  6. android返回后屏幕旋转了,Android recovery 模式下屏幕显示旋转

    Android recovery 模式下屏幕显示旋转 大家在网上搜索 Android屏幕旋转,成千上万的文章,但是没有几个是写recovery 模式的.难道你们只旋转正常模式下的屏幕方向,不管reco ...

  7. 十五、CSS 3新特性详解(三)——3D转换(位移、旋转、呈现)、透视perspective、旋转rotateX、Y、Z、呈现transform-style

    HTML5 第三天 一. 认识 3D 转换 3D 的特点 近大远小 物体和面遮挡不可见 三维坐标系 x 轴:水平向右 – 注意:x 轴右边是正值,左边是负值 y 轴:垂直向下 – 注意:y 轴下面是正 ...

  8. 信息学奥赛一本通 1127:图像旋转 | OpenJudge NOI 1.8 11:图像旋转

    [题目链接] ybt 1127:图像旋转 OpenJudge NOI 1.8 11:图像旋转 [题目考点] 1. 二维数组 [解题思路] 以下分析中,行列从1开始数.该二维矩阵有n行m列,行号为1~n ...

  9. 平面直角系【坐标系旋转】、【点绕坐标系旋转】、【A点绕B点旋转】

    前言 本文整理在平面直角系中,坐标系旋转.某点绕着坐标系旋转.坐标点A 绕着点B旋转,求旋转后的点坐标.看了网上好的文章,发现部分有误或不完整,这里简单总结一下. 一.点绕坐标系旋转 坐标系不变,某点 ...

  10. Flutter·变换·先旋转再平移与先平移再旋转

    0 前言 最近在学习<Flutter实战>,在变换章节遇到作者提出的一个思考题: 使用Transform对其子组件先进行平移然后再旋转和先旋转再平移,两者最终的效果一样吗?为什么? 动手实 ...

最新文章

  1. Linux中如何配置IP
  2. today便利 java_在Today今天便利店吃饭,你的要求可以再高一点
  3. 一个表单同时向两个页面传值
  4. Latex的空格 转载
  5. VB禁用CTRL +ALT + DEL (2)
  6. 各种Camera,总有一款适合你(一)
  7. Ubuntu(小名乌班图)的安装顺便附带VMware的安装教程,以及VM的激活密钥
  8. 树莓派4b摄像头使能
  9. 程序人生——苏嵌第三天
  10. 关于word2016中mathtype无法使用以及“由于宏安全设置,无法找到宏或宏已被禁用”的解决方案
  11. 大盘点 | 性能最强的目标检测算法
  12. 使用Petalinux实现ZYNQ的linux程序开发(实现简单的socket通信程序)
  13. 笑能降血压,笑还能释放压力,减轻沮丧感;笑可以刺激人体分泌多巴胺,使人产生欣快感
  14. linux通过无线网卡上网,在Kubuntu Linux下轻松使用无线上网卡
  15. linux下freerdp编译,linux下安装freerdp连接windows远程桌面的好软件软件
  16. CH551、CH552、CH554 、CH558、CH559下载步骤
  17. java 矢量_[Java教程]矢量图标的使用
  18. 北京网站建设比较好的公司
  19. Transformer20
  20. 加入CSDN的2019天 回忆我的CSDN之旅

热门文章

  1. 西门子S7-200PLC
  2. 地图使用:地点关键词的输入提示
  3. 加码自动驾驶,四维图新开启长期战争
  4. Express语言和STEP标准
  5. 业务 IT 一体化:华为云 SaaS Package 做到了
  6. 数电实验课设:基于basys3的键盘电子琴
  7. 六年级上册计算机课教案,六年级信息技术上册《砸蛋有惊喜》教学设计
  8. 【黄啊码】我问ChatGPT如何学习PHP语言,它是这么说的
  9. Maven Eclipse Junit单元测试解 + 进阶使用Mockito做service层单测(万物皆可mo)+对于异步async方法的单测
  10. 小狗钱钱--读书笔记