AVL右旋转思路分析与图解

AVL树右旋转思路分析与图解

其实我们前面讲过了左旋转之后再学习右旋转就会非常的简单了, 因为我们的右旋转相对我们的左旋转只是换了一个方向而已, 那么下面我们就来讲解右旋转的实现
对于数列{10, 12, 8, 9 ,7, 6} , 当我们插入6的时候leftHeight() - rightHeight() > 1成立(也就是此时的树成为了一颗不平衡树, 并且这个时候我们观察构成的AVL树之后我们可以发现此时的最小不平衡子树是一个LL型的不平衡子树), 所以这个时候我们就要采用某种操作让这个不平衡的树重新平衡起来, 那么我们要如何处理之后可以让这个树重新平衡起来?
  • 因为这时候的最小不平衡子树是一个LL型最小不平衡子树, 所以我们此时只要对这个最小不平衡子树的根节点执行一个右旋转即可完成平衡化处理:
那么如何实现右旋转? 我们这里通过图解来进行描述:

在这里插入图片描述

右旋转的具体实现过程:
  1. 创建一个新的结点newNode, 值等于当前最小不平衡二叉树根节点的值
  2. 让新结点newNode的右子结点指向当前根节点的右子树
  3. 让新结点的左子节点指向当前根节点的左子节点的右子树
  4. 让当前根节点的值换为当前根节点的左子节点的值
    • 因为右旋的时候旧根节点的左子结点的值就是我们的新根节点值
  5. 把根节点的左子树设置为当前根节点的左子树的左子树( 将原本存储新根节点值的结点从树中删除掉)
  6. 把根节点的右子树设置为新结点

注意: 整个过程中根节点是没有变的, 只是根节点的值发生了改变

右旋的核心思想: (两步)
  1. 原本旧根结点为现在新根节点的右子树
  2. 原本新根节点的右子树变为现在旧根结点的左子树
这里我们来对左旋和右旋进行一个易错归纳(我们以左旋为例):
  1. 对于如下结构的左旋到底是如何实现的:
    在这里插入图片描述
  • 首先我们要知道上图的最小不平衡子树并不是整棵树, 而是如下的子树:

在这里插入图片描述

  • 所以我们最终应该是对这个最小不平衡子树的根节点执行一个左旋的操作, 因为此时的最小不平衡子树显然是一个RR型最小不平衡子树, 最终这个最小不平衡子树会变成如下:
    在这里插入图片描述

  • 这个时候我们要注意: 我们的根节点一直没有变化过, 这个时候只是原本的根节点的值从3变为了4, 但是节点并没有发生变化, 所以也就是这个最小不平衡子树一直没有和整个树断开连接, 因为根节点始终没有变过, 所以最终平衡之后就会是如下:

在这里插入图片描述

  • 最终得到了如上的平衡二叉树, 我们的平衡化就算是完成了, 但是这个时候有的人会提出一个思路: 就是我们可不可以通过改变指针的指向, 不用创建新的结点来完成这次左旋操作?(比如说改变②结点的指向, 直接让②结点指向④结点)
    • 答案是不建议的(我们一般不这么做), 因为最终左旋操作是在递归中执行的, 最终我们是会拿到最小生成树的根节点, 也就是④结点, 所以我们无法改变②结点的指向, 如果我们非要拿到②结点肯定也是可以的, 但是这样的算法的效率可能就不会太高 —> 所以我们建议的就是通过建立一个新的节点的方式来完成, 这样的效率是比较高的, 并且实现起来的思路也比较简单
  1. 左旋和右旋其实就是一个针对RR型和LL型最小不平衡子树的平衡算法, 这个算法的核心是(我们以左旋为例): 降低最小不平衡子树的根节点的右子树的高度
    • 这里我们其实就是将最小不平衡子树的右子树的高度降低了1, 然后将最小不平衡子树的左子树的高度加了1

      • 而我们要降低最小不平衡子树的根节点的右子树的高度, 肯定是要通过变动二叉树结构来实现, 所以我们其实只需要知道如何变动即可:

        • 我们只需要让最小不平衡子树的根节点的值变为根节点右子节点的值, 然后做了这一步操作之后树中的结构以及元素每个值的元素的个数都会不平衡, 所以我们只需要通过一系列操作之后重新让树平衡起来, 这样的算法就是**“左旋算法”**

          • 上面只是一种实现: 我们是先将原本的根节点保存下来, 然后通过改变根节点的值实现的左旋, 这种实现的好处就是根节点并没有变化, 所以最小不平衡子树和整个不平衡树并没有失去连接, 这种方式比较好操作, 好理解.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值