数据结构——平衡二叉树的的旋转问题

       在学习有关数据结构平衡二叉树的时候,我就特别困惑在二叉查找树中是如何将树旋转和交换孩子的。这里,我将自己的总结写下来,喜欢大家一起交流进步!
       这个需要旋转的情况大体可以·分为4种情况。分别是LL型,RR型,LR型,RL型。在此之前,我先解释以下一个概念,在严蔚敏老师所写的一本数据结构书本上,有这么一个概念:最小不平衡子树根节点a。它的解释是:离插入点最近,且平衡因子的绝对值超过1的祖先节点。下面我也将会指出那些是最小不平衡子树根节点。
       LL型。这个就是说,在a的左子树根节点的左子树上面插入节点。注意,这里所强调的是a的左子树根节点的左子树上,没有说一定要是左子树的根节点的左子树的左孩子上。例如,下面两种都是LL型。(这里的图片是别的博主的,我之后会将其原文链接发到文章末尾,大家可以去参考。)
LL型的一种情况
LL的别的情况
可以看到,这里就是发生了“托付”孩子的情况。当然,也有可能不会出现“托付”孩子的情况。但是,我下面说的方法,是一个万能方法。可以看到,这里的最小不平衡子树根节点a就是值为5的这个点。我们找到该节点,并以它的左孩子为中心(如果是RR型就是以右孩子为中心),开始右旋转。那么,4和5之间的线就会断开。因为4本来就是有右孩子的,而旋转之后,5也要成为它的右孩子;同时,5本来也是有左孩子的,但是旋转过后就没有了。这就会产生了两个矛盾。借用另一位博主的话(之后链接也会附上):马克思主义说过矛盾可以同归于尽,这里我们来感受下马克思主义哲学的优越性。我们可以将4的右孩子给5作为其左孩子,这个样子矛盾就解决了!当然,为什么可以这么做,就是因为对于二叉查找树,5的左孩子肯定会比5小,而4就是5的左孩子。那么4的右孩子也会比5小,去做5的左孩子没有什么不可以的。如果没有需要托付孩子的情况那就更加简单了,这里就不多说了。
       RR型。和LL型基本上完全一样,大家仔细体会一哈就好。
       LR型。首先,要明白一点,这个也可能会出现不托付孩子的情况,并不是说一定会托付孩子,上图大家就清楚了。

这个就是LR型但是没有交换孩子的情况
但是我们对于LR型怎么实现托付孩子捏。这个方法是我在数据结构算法分析那本上悟出来的(好吧,也不算悟出来)。首先我们得找到最小不平衡子树根节点,取名为k3,k3的左孩子为k1,k1的右孩子为k2。然后,就开始托付孩子了。将k2的左孩子给k1当右孩子,k2的右孩子给k3当左孩子。然后,k2取代K3的位置。现在给大家看图。
LR型的一种情况
我所说的K2,K1,K3就是图中的。现在我来举两个例子,大家就清楚了。
情况一
根据上面说的,5为K3,4为K1,4.5为K2。按照规律,将4.5(K2)的左孩子4.2以及其孩子,作为4(K1)的右孩子,4.5(K2)的右孩子4.7作为5(K3)的左孩子。然后,左旋转,右旋转即可。看图,加强理解。
在这里插入图片描述
这里大家应该就没有什么问题了。
如果不要交换孩子,那么这个方法还有用吗?当然有用,直接上图。这个例子是RL型,正好,验证一哈别的情况。
在这里插入图片描述
看到图片f-h,就是旋转过程,我已经将k3,k1,k2标注到上面了。大家可以对照看一下。因为这里k2没有孩子,所以就没有交换孩子,你也可以理解为交换的孩子为空。
       RL型。通过上面的例子看到也是一样的,所以就不多讲了。大家有什么问题,可以留言,我们一起讨论研究。

下面是我参考的博文,大家可以去看看,写的也很不错!
https://blog.csdn.net/csdnnmbdybb/article/details/83050894
https://blog.csdn.net/qq_34840129/article/details/80728186


7/22 2019补充
       最近看算法书籍,发现在《算法笔记》这本书中关于这个AVL树讲的还是蛮清楚的。之后复习的时候可以去看看

  • 17
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值