旋转是很多二叉平衡树维持平衡的主要手段,在这里复习一下。其实旋转过程中节点位置的变化只要遵循一个原则就行了:比Root小的在左子树,比Root大的在右子树。(当然这里前提条件是左小右大)。

情况一:插入F节点导致失衡:

这里失衡的是A的左右子树,很容易就可以想到旋转B-A链,值得注意的是E节点,它原先在B的右子树,现在也依然在B的右子树,它原先在A的左子树,现在也依然在A的左子树。

若插入F节点在D的右子树处,旋转操作依然是上图那样,不谈。

但如果插入F节点是E的孩子就不一样了。

情况二:插入F节点导致失衡:

插入节点是E的孩子时,如果我们还像上面那样旋转B-A链,旋转后的树依然是不平衡的。事实上,这样的旋转使得B成为了新的根节点,而原图中比B大的节点有4个,比B小的节点只有D,若B为根其左子树只能为D,必定是不平衡的。

我们仔细观察原图,这里E节点是很特殊的节点。首先它是实际执行了插入操作的节点,其次图中比E小的节点有B、D、F,比E大的节点有A、C。如果能够让E节点做新的根节点就很好平衡了,那么怎样让E节点“上位”呢?

方法是进行两次旋转,如下图:

E节点恐成最大赢家……

插入节点是E的右子树的情况与之类似,这里给出旋转图:

F比E大,双旋之后还是在E的右节点。

双旋看图理解起来简单,实际实现时要注意,我们可以判断失衡的是A节点,由A有直接关系的是B和C,那么我们怎么知道新插入的F节点是D的子树还是E的子树呢?这里的方法是比较F节点值与B的大小,大则是E的子树,要左-右共两次旋转,小则是D的子树,要一次右旋转。

当然还要考虑镜像情况:

情况三:插入 F导致失衡:

进行一次左旋,关注D节点,它比C小,旋转后依然在C的左子树。

情况四:插入F导致失衡:

这时候左旋失败,理由和之前右旋失败类似,比C节点大的节点只有一个E,C是没法做新的根节点的。这里特殊的是D节点。

进行右-左两次双旋就可以了。D节点:爽到……

插入节点是D的右子树情况类似,RT:

二叉平衡树的旋转操作相关推荐

  1. 数据结构源码笔记(C语言):二叉平衡树的相关操作算法

    //二叉平衡树的相关运算 #include<stdio.h> #include<malloc.h> #include<string.h>typedef char I ...

  2. 二叉平衡树(C++)

    背景: 二叉平衡树,就是根据二叉搜索树进行优化,让其速度更加的快,如果读者没有学过二叉搜索树,可以前往以下链接查看资料: http://t.csdn.cn/Sjjjshttp://t.csdn.cn/ ...

  3. 二叉平衡树的插入和删除操作

    [转载]二叉平衡树的插入和删除操作 1.      二叉平衡树 二叉排序树查找.插入和删除操作的时间复杂度和树的深度n有关.构建树时,当先后插入的结点按关键字有序时,二叉排序树退化为单枝树,平均查找长 ...

  4. 二叉平衡树(AVL树)从演变、平衡、旋转加练习题逐步分析,看不会过来打我

    想要了解AVL树,就得了解它是怎么演化来的,它并不是凭空创造的一个新数据结构,而是发现其他数据结构的不完美而演变过来的. 二叉查找树 我想二叉排序树结构的起源一定是来源于生活,二叉树只有一个根节点,每 ...

  5. 数据结构与算法——二叉平衡树(AVL树)详解

    文章目录 AVL树概念 不平衡概况 四种平衡旋转方式 RR平衡旋转(左单旋转) LL平衡旋转(右单旋转) RL平衡旋转(先右后左双旋转) LR平衡旋转(先左后右单旋转) java代码实现 总结 AVL ...

  6. AVL树(二叉平衡树)详解与实现

    公众号文章链接 AVL树概念 前面学习二叉查找树和二叉树的各种遍历,但是其查找效率不稳定(斜树),而二叉平衡树的用途更多.查找相比稳定很多.(欢迎关注数据结构专栏) AVL树是带有平衡条件的二叉查找树 ...

  7. 【数据结构进阶】二叉平衡树

    一. 二叉平衡树 概念 二叉搜索树有称 二叉排序树,它也可以是一个空树. 如果它的左子树不为空,则左子树上所有结点的值都小于根结点的值 如果他的右子树不为空,则右子树上所有结点的值都大于根结点的值 它 ...

  8. 《二叉平衡树(一)》

    [一]二叉搜索树的概念 定义:二叉搜索树又称二叉排序树,他或者就是一棵空树,是具有以下性质的二叉树: 1.若它的左子树不为空,则左子树上所有节点的值都小于根节点的值. 2.若它的右子树不为空,则右子树 ...

  9. C语言实现二叉平衡树

    [前置知识]二叉树和二叉排序树 目录 1.什么是AVL树 2.怎么平衡 前言 对于大量的数据而言,链表的线性访问时间太慢,不宜使用.本章节将会介绍一种简单的数据结构:树(tree),其大部分操作的运行 ...

  10. 二叉平衡树(AVL树)详细理解

    二叉平衡树(AVL树) AVL树插入元素结论 单旋转: 双旋转: 如果看到后面会发现,我下面举得列子,类型一和类型三和我结论里面的有点不一样,那是因为类型一的节点4和类型三的节点14无论以何种方式都能 ...

最新文章

  1. python数据处理与机器学习
  2. Linux C 的风格
  3. 字符编码解码整合工具
  4. linux修改密码最短生存时间,Linux基础命令---修改用户密码
  5. plsql存储过程修改后怎么保存_分布式基础-存储引擎
  6. linux shell学习笔记(二) 变量和运算符
  7. 处理血压信号_测血压检测健康,8款高品质血压计推荐
  8. 什么是hypernetworks? hypernetworks简单介绍
  9. Axure总结和感想
  10. 企业微信api,企业微信sdk接口
  11. Android Bmob之用户更改头像(上传图片、下载图片和更新图片)
  12. 如何采集小红书最新版(2018年9月)数据
  13. Kindle的使用体验
  14. mysql、oracle、sqlserver各自的默认端口号
  15. Vue.js入门(学习笔记)
  16. 企业邮箱和个人邮箱之间有什么区别?
  17. STM32F407ZGT6的串口通信
  18. npm ERR! code ETIMEDOUTnpm ERR! errno ETIMEDOUTnpm ERR! network request to http://nexus.h3yun.com:
  19. 个人对于“初链”白皮书和黄皮书的解读
  20. mldonkey系列之四──Mldonkey命令解释[zt]

热门文章

  1. 实验三 大数据可视化工具—ECharts
  2. 智芯传感推出高性能低功耗ZXP2绝压压力传感器
  3. Python逆波兰表达式
  4. 两种SOA平台建设方案比较
  5. 单片机音频谱曲软件_基于51单片机音乐播放仿真 乐谱制作软件 音乐资料
  6. Win10网卡驱动突然消失
  7. 达梦数据库-Dmpython+xlrd实现excel表数据一键入库代码分享
  8. 苹果电脑上四款好用的可以记事的日历软件
  9. JQ实现图片预览(轮播,放大缩小,拖拽,ajax请求,旋转)
  10. 新浪微博批量删除微博的方法