浅析AVL树–AVL树的双旋转

接上篇博文:浅析AVL树–AVL树的概念及单旋转

AVL树如何恢复平衡之双旋转

首先假设我们有一颗已经处于平衡的AVL树:

上篇博文已经解决了LL和RR两种情况的平衡恢复解决方案----单旋转。这篇博文来看双旋转情形。这时候我们插入结点7,我们可以发现这时这棵树并没有失去平衡:

但是,如果我们继续插入结点8,这棵树就会再次处于失衡状态:

我们首先可以发现结点9左右子树高度差2—这是第一个失衡的结点。
然后我们可以发现结点6左右子树高度差2—这是第二个失衡的结点。
最后发现根节点3也失衡了—它的左右子树高度同样差2。

我们首先从离插入的结点8最近的结点9开始处理。为了方便起见我们将结点9单独提出来考虑:

可以看到此时结点9失衡的原因是结点9的左儿子(L)的右子树(R)被插入了新结点8。如果我们这时候尝试单旋转对它进行修复,我们会发现这种修复方式无效:

但是,我们这样想:如果先将结点7和结点8执行RR单旋转,那么这棵树就变成了LL单旋转可修复情形了:

然后我们可以执行LL单旋转进行修复:

如上图所示,我们成功地将新插入结点8而造成的失衡成功通过两次单旋转修复,这种修复的方式我们称为LR双旋转(因为树的失衡原因是在结点9的左儿子的右子树插入了新结点)。有些童鞋可能会担心旋转之前结点8可能还会有左右儿子从而被覆盖丢失,其实无需担心,因为执行的两次单旋转里已经考虑到了这个问题而对结点8的左右儿子进行了挪动。
通过上面这个例子,我们可以总结LR双旋转的伪代码如下:

对当前结点的左儿子进行RR单旋转;
对当前结点进行LL单旋转;
返回旋转后结果;

执行完一次修复后此时整棵树如下:

我们发现这棵树再次平衡了–结点6和结点3也平衡了,这是因为本身这两个结点失衡的原因就是结点6、结点3的右子树高度改变了,修复之后,自然就平衡了。

对应的,假如上面失衡的情况是这样的:

这种情况称为RL失衡。我们可以通过进行RL双旋转来进行修复,即先对结点9和结点8进行一次LL单旋转,再对整棵树进行一次RR单旋转:

我们可以总结出RL双旋转的伪代码如下:

对当前结点的右儿子进行LL单旋转;
对当前结点进行RR单旋转;
返回旋转后结果;

关于AVL树的C++实现请看下篇博文:
浅析AVL树–AVL树的C++实现

浅析AVL树--AVL树的双旋转相关推荐

  1. AVL树的单双旋转解析

    [0]README 0.0) 本文部分idea 转自:http://blog.csdn.net/collonn/article/details/20128205 0.1) 本文专注于 解析 AVL 树 ...

  2. AVL树、splay树(伸展树)和红黑树比较

    AVL树.splay树(伸展树)和红黑树比较 一.AVL树: 优点:查找.插入和删除,最坏复杂度均为O(logN).实现操作简单 如过是随机插入或者删除,其理论上可以得到O(logN)的复杂度,但是实 ...

  3. 平衡查找树C语言程序,树4. Root of AVL Tree-平衡查找树AVL树的实现

    对于一棵普通的二叉查找树而言,在进行多次的插入或删除后,容易让树失去平衡,导致树的深度不是O(logN),而接近O(N),这样将大大减少对树的查找效率.一种解决办法就是要有一个称为平衡的附加的结构条件 ...

  4. 种树:二叉树、二叉搜索树、AVL树、红黑树、哈夫曼树、B树、树与森林

    虽然今天不是植树节,但是我今天想种树. 文章目录 树,什么是树? 二叉树 定义 二叉树的创建 二叉树的前中后序遍历 前序遍历: 中序遍历 后序遍历 已知前序.中序遍历结果,还原二叉树 已知后序.中序遍 ...

  5. 平衡二叉树(AVL)的左旋转右旋转和双旋转

    平衡二叉树的介绍 首先,咱们先来说一下为什么要提出平衡二叉树的概念,如果一个二叉排序树是一个只有左子树或者右子树的二叉排序树的时候,其实它就相当于一个链表,但是他的查询,删除,遍历的速度却没有链表快. ...

  6. Algorithm:树结构(二叉树/多路查找树/字典树)的简介、具体结构(FBT/CBT/BST/BBT/Heap/Huffman、B树/B+树/R树、字典树)及其运算(增删查/遍历/旋转)、代码实现

    Algorithm:树结构(二叉树/多路查找树/字典树)的简介.具体结构(FBT/CBT/BST/BBT/Heap/Huffman.B树/B+树/R树.字典树)及其运算(增删查/遍历/旋转).代码实现 ...

  7. Algorithm:树相关算法(BBT/BST/B树/R树)简介(二叉查找树、二叉查找树的插入节点、二叉查找树的删除、二叉树的遍历、平衡二叉树)C 语言实现

    Algorithm:树相关算法(BBT/BST/B树/R树)简介(二叉查找树.二叉查找树的插入节点.二叉查找树的删除.二叉树的遍历.平衡二叉树)C++语言实现 目录 树的基础知识 1.二叉树的遍-前序 ...

  8. 带父节点的平衡二叉树_平衡二叉树的左右旋以及双旋转的图文详解

    高度平衡的搜索二叉树 一棵平衡树,或是空树,或是具有以下性质的二叉搜索树:左子树和右子树都是AVL树,且左右子树的高度之差的绝对值不超过1. 该二叉树,根结点的右子树高度为3,左子树高度为2.结点上方 ...

  9. 数据结构--伸展树(伸展树构建二叉搜索树)-学习笔记

    2019/7/16更新:封装SplayTree进入class:例题:http://poj.org/problem?id=3622 一个伸展树的板子: #include<stdio.h> # ...

最新文章

  1. jQuery源码学习之Callbacks
  2. Go语言可能会遇到的坑
  3. Impala入门笔记
  4. Redis(七):Hash哈希数据类型详解
  5. 未转变者服务器未正常运行,未转变者Battleye服务不能正常运行 | 手游网游页游攻略大全...
  6. Android签名机制---签名过程
  7. UI设计素材字体|三明治3D文字效果– 3个角度
  8. 联通辟谣“不支持华为 5G”;罗永浩称索尼手机不如锤子;Linux 5.2.1 发布 | 极客头条...
  9. 如何安装老版本Eclipse汉化——以2020-06为例
  10. 迅为恩智浦iTOP-IMX6开发平台
  11. 【场景化解决方案】OA审批与用友U9数据集成
  12. 玩转流量,天下无锅——IT运维人员的九阳神功(上)| 技术分享
  13. 关于XDC工具的文章
  14. Azure云平台学习之路(一)——Azure简介
  15. excel多条件筛选公式
  16. 癌症免疫细胞治疗知识:CAR-T与TCR-T的区别在哪里?--转载
  17. 使用appfox工具测试登录有图片验证码接口的问题
  18. 作为成年人的基本道德之一,就是不…
  19. python编程大赛规则_如何评价「杨超越杯编程大赛」?
  20. Java——通过Java代码启动批处理文件(一)

热门文章

  1. c语言单链表的按序号查找,以下为单链表按序号查找的运算,分析算法,请在______处填上正确的语句。 pointer find_lklist(1kl...
  2. cad图纸比对lisp_CompareDWG|CAD图纸比较软件(CompareDWG)下载v2018 官方版 - 欧普软件下载...
  3. a1502配置 macbook_a1502的macbook pro 苹果系统和… - Apple 社区
  4. “75后”院士,任顶级大学副校长
  5. testlink mysql_windows下testlink环境搭建
  6. 教你九招防电脑辐射的方法!
  7. CF329B Biridian Forest
  8. NONMEM软件自定义模型
  9. SparkStreaming通过读取文件动态黑名单过滤
  10. Ubuntu下安装Datax-web数据交换平台