在学习有关数据结构平衡二叉树的时候,我就特别困惑在二叉查找树中是如何将树旋转和交换孩子的。这里,我将自己的总结写下来,喜欢大家一起交流进步!
       这个需要旋转的情况大体可以·分为4种情况。分别是LL型,RR型,LR型,RL型。在此之前,我先解释以下一个概念,在严蔚敏老师所写的一本数据结构书本上,有这么一个概念:最小不平衡子树根节点a。它的解释是:离插入点最近,且平衡因子的绝对值超过1的祖先节点。下面我也将会指出那些是最小不平衡子树根节点。
       LL型。这个就是说,在a的左子树根节点的左子树上面插入节点。注意,这里所强调的是a的左子树根节点的左子树上,没有说一定要是左子树的根节点的左子树的左孩子上。例如,下面两种都是LL型。(这里的图片是别的博主的,我之后会将其原文链接发到文章末尾,大家可以去参考。)


可以看到,这里就是发生了“托付”孩子的情况。当然,也有可能不会出现“托付”孩子的情况。但是,我下面说的方法,是一个万能方法。可以看到,这里的最小不平衡子树根节点a就是值为5的这个点。我们找到该节点,并以它的左孩子为中心(如果是RR型就是以右孩子为中心),开始右旋转。那么,4和5之间的线就会断开。因为4本来就是有右孩子的,而旋转之后,5也要成为它的右孩子;同时,5本来也是有左孩子的,但是旋转过后就没有了。这就会产生了两个矛盾。借用另一位博主的话(之后链接也会附上):马克思主义说过矛盾可以同归于尽,这里我们来感受下马克思主义哲学的优越性。我们可以将4的右孩子给5作为其左孩子,这个样子矛盾就解决了!当然,为什么可以这么做,就是因为对于二叉查找树,5的左孩子肯定会比5小,而4就是5的左孩子。那么4的右孩子也会比5小,去做5的左孩子没有什么不可以的。如果没有需要托付孩子的情况那就更加简单了,这里就不多说了。
       RR型。和LL型基本上完全一样,大家仔细体会一哈就好。
       LR型。首先,要明白一点,这个也可能会出现不托付孩子的情况,并不是说一定会托付孩子,上图大家就清楚了。


但是我们对于LR型怎么实现托付孩子捏。这个方法是我在数据结构算法分析那本上悟出来的(好吧,也不算悟出来)。首先我们得找到最小不平衡子树根节点,取名为k3,k3的左孩子为k1,k1的右孩子为k2。然后,就开始托付孩子了。将k2的左孩子给k1当右孩子,k2的右孩子给k3当左孩子。然后,k2取代K3的位置。现在给大家看图。

我所说的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树讲的还是蛮清楚的。之后复习的时候可以去看看

数据结构——平衡二叉树的的旋转问题相关推荐

  1. 数据结构---平衡二叉树

    数据结构-平衡二叉树 原理:参考趣学数据结构 代码: #include<stdio.h> #include<stdlib.h> typedef struct avlTree { ...

  2. 用c语言编译二叉树,C语言 数据结构平衡二叉树实例详解

    数据结构平衡二叉树 参考代码如下: /* 名称:平衡二叉树 语言:数据结构C语言版 编译环境:VC++ 6.0 日期: 2014-3-26 */ #include #include #include ...

  3. 数据结构-平衡二叉树(AVL树)

    目录 1,平衡二叉树的介绍 1.1,二叉排序树存在的问题 1.2,平衡二叉树 1.3,平衡二叉树的创建 1.4,平衡二叉树的查找 2,代码实现 2.1,平衡二叉树的节点类型 2.2,LL旋转(单右旋转 ...

  4. (王道408考研数据结构)第五章树-第四节2:平衡二叉树(AVL)及其旋转

    文章目录 一:AVL树基本概念 二:AVL树实现原理 (1)构建AVL树 (2)构建演示 (3)旋转方法 A:右单旋转调整(插入到较高左子树左侧) B:左单旋转调整(插入到较高右子树右侧) C:先左后 ...

  5. 数据结构:平衡二叉树概念、旋转

    平衡二叉树 ​ 平衡二叉搜索树,又被称为AVL树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树. --来自百度百科 ​ 由于普通的二叉查找 ...

  6. 浅谈数据结构-平衡二叉树

    平衡二叉树(Balanced Binary Tree)是二叉查找树的一个进化体,也是第一个引入平衡概念的二叉树.1962年,G.M. Adelson-Velsky 和 E.M. Landis发明了这棵 ...

  7. 数据结构——平衡二叉树

    一.平衡二叉树的定义 平衡二叉树(AVL 树)仍然是一棵二叉查找树,只是在其基础上增加了"平衡"的要求.所谓平衡是指,对 AVL 树的任意结点来说,其左子树与右子树的高度之差的绝对 ...

  8. 数据结构 平衡二叉树avl c++

    平衡二叉树:一颗空树,或者是具有以下性质的二叉树 左子树和右子树都是平衡二叉树 左子树和右子树的深度只差不超过1 把二叉树节点的平衡因子BF(Balance Factor)定义为该节点的左子树深度减去 ...

  9. [ 数据结构 ] 平衡二叉树(AVL)--------左旋、右旋、双旋

    0 引出 数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST), 并分析问题所在 回顾:二叉搜索树 左子树全部为空,从形式上看,更像一个单链表. 插入速度没有影响 查询速度明显降低(因为需 ...

最新文章

  1. 不会一致性hash算法,劝你简历别写搞过负载均衡
  2. 突袭HTML5之SVG 2D入门1 - SVG综述
  3. C#中的数据类型转换
  4. 特征提取 notes
  5. mysql更新视图的时候有时候可以不满足视图条件的值也能更新成功
  6. JS点击获取验证码后60秒内禁止重新获取(防刷新)
  7. 2.12linux csf 防火墙 防止少量的ddos cc攻击
  8. html之浮动和定位
  9. 成都最最最牛逼的 IT 公司全在这了
  10. 一个轻量的Linux运维监控脚本
  11. Relative Ranks问题的两种实现
  12. 小红书行业黑话大全,小红书专业术语一手掌握
  13. zcmu --1919(多重背包)
  14. 重复代码 Duplicated Code
  15. Centos 8.0 安装图形化界面(超详细)
  16. 什么是云仓一件代发?电商物流云仓,新疆云仓
  17. S5PV210 android4.0 在Sate210的上的调试情况报告
  18. 常用计算机外部设备有哪些,常用的计算机外设有哪些?
  19. python中文相似度_python 人脸对比--百度API人脸相似度识别(超简单)-Go语言中文社区...
  20. Happens-Before 先行发生原则

热门文章

  1. 在CmakeLists.txt中添加-ldl编译选项解决:undefined reference to `dlopen'问题
  2. WIZnet 以太网帽子大赛 2022
  3. MOBA类游戏解决方案
  4. STM32 IAR工程-Keil MDK转换详解
  5. php 编程祝新年快乐_编程语言排行榜前10的语言,打印拜年问候语
  6. Linux 操作文本内容命令
  7. python的rsa库的使用
  8. 【2022-06-05】【知识梳理】数据库系统概念 第一章 简介(docx)
  9. n918st能刷Android5吗?,中兴N918st (V5S 双4G)一键刷机教程图解,怎么刷机简单
  10. python open写入_【Python】使用with open读写文件时,文件不存在没有自动创建