AVL Trees (Balanced binary search trees)

平衡二叉树的定义:左右子树深度差绝对值不能超过1。

是什么意思呢?比如左子树的深度是2,右子树的深度只能是1 或者3。

这个时候我们再按顺序插入1、2、3、4、5、6,一定是这样,不会变成一棵“斜树”。

那它的平衡是怎么做到的呢?怎么保证左右子树的深度差不能超过1 呢?

https://www.cs.usfca.edu/~galles/visualization/AVLtree.html

插入1、2、3。

我们注意看:当我们插入了1、2 之后,如果按照二叉查找树的定义,3 肯定是要在2 的右边的,这个时候根节点1 的右节点深度会变成2,但是左节点的深度是0,因为它没有子节点,所以就会违反平衡二叉树的定义。

那应该怎么办呢?因为它是右节点下面接一个右节点,右-右型,所以这个时候我们要把2 提上去,这个操作叫做左旋。

同样的,如果我们插入7、6、5,这个时候会变成左左型,就会发生右旋操作,把6提上去。

所以为了保持平衡,AVL 树在插入和更新数据的时候执行了一系列的计算和调整的操作。

平衡的问题我们解决了,那么平衡二叉树作为索引怎么查询数据?

在平衡二叉树中,一个节点,它的大小是一个固定的单位,作为索引应该存储什么内容?

它应该存储三块的内容:

第一个是索引的键值。比如我们在id 上面创建了一个索引,我在用where id =1 的条件查询的时候就会找到索引里面的id 的这个键值。

第二个是数据的磁盘地址,因为索引的作用就是去查找数据的存放的地址。

第三个,因为是二叉树,它必须还要有左子节点和右子节点的引用,这样我们才能找到下一个节点。比如大于26 的时候,走右边,到下一个树的节点,继续判断。

如果是这样存储数据的话,我们来看一下会有什么问题。

在分析用AVL 树存储索引数据之前,我们先来学习一下InnoDB 的逻辑存储结构。

平衡二叉树(AVL Tree)(左旋、右旋)相关推荐

  1. avl树左旋右旋的理解

    一直没搞懂非平衡二叉树变平衡二叉树时左旋右旋,今天下定决心搞懂,然后在众多博客中终于找到了这样一篇,非常形象,记录如下: AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大 ...

  2. 搞懂平衡二叉树的左旋右旋双旋(Java实现)

    刚看到韩顺平老师的数据结构与算法对于平衡二叉树的讲解(最后会附上地址),有如下理解,希望能帮助大家!哪里需要改正的欢迎指正! 平衡二叉树:一种二叉排序树(BST Binary Sort Tree)的升 ...

  3. 平衡二叉树的左旋右旋详解 看不懂你打我

    平衡二叉树的左旋右旋 看不懂你打我 左旋右旋的操作 为什么要左旋右旋 左旋右旋能保持排序二叉排序树的性质吗 下次写平衡二叉树的LL.RR.LR.RL. 左旋右旋的操作 1.左旋:对X节点左旋,即以X的 ...

  4. [转]C#与数据结构--树论--平衡二叉树(AVL Tree)

    C#与数据结构--树论--平衡二叉树(AVL Tree) http://www.cnblogs.com/abatei/archive/2008/11/17/1335031.html 介绍 我们知道在二 ...

  5. 二叉树旋转--左旋|右旋

    二叉树旋转 二叉树的旋转主要是应用在AVL树中,当添加一个节点时候导致左右两个子树的高度差不在是-1 , 1 , 0而变成了2 或者-2.此时就需要用到左旋/右旋了.当然左右旋或者有左旋也是基于左旋和 ...

  6. nyoj202 红黑树 (二叉树的左旋右旋)

    题目202 题目信息 运行结果 本题排行 讨论区 红黑树 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 什么是红黑树呢?顾名思义,跟枣树类似,红黑树是一种叶子是黑色果子 ...

  7. 详解红黑树之左旋右旋

    为什么要左旋右旋? 为了使得左右子树的高度差在一定范围内,需要通过旋转调整,这样就可以保持平稳的搜索效率 左旋: 步骤 1.设原来E的父节点是father,那么左旋之后需要改变的是: 2.S和fath ...

  8. 左旋右旋问题一次搞定!!!

    左旋右旋问题的解决 编程思想 1.在左右旋函数中实现该函数功能首先要想好如何存放移位后的字符元素 2.左旋时将字符串首元素赋给临时变量tmp而后将字符串元素依次前移一位 3.将tmp的值再赋给字符串的 ...

  9. HashMap 数据结构之红黑树, 红黑树在什么时候左旋 右旋 如何旋转

    树结构是数据结构中最经典最常用的结构之一,也是面试中常问的面试题,最近学习了一下红黑树的知识,记录整理一下 文章目录 一.红黑树的特征 二.变色左旋和右旋 1.变色规则 2.左旋 3.右旋 总结 前言 ...

  10. 字符串左旋右旋——三步旋转法和移相法

    题目:实现一个函数,可以左旋字符串中的k个字符. AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA 方法一:三步旋转法 左旋程序思路:首先根据画图得知左旋后的结果,然后在分析 ...

最新文章

  1. mysql format函数对数字类型转化的坑
  2. linux 安装 celluloid 视频播放器
  3. android第三次作业
  4. QT的QHttpMultiPart类的使用
  5. linux的网络配置
  6. 云原生五大趋势预测,K8s安卓化位列其一
  7. 滴滴悬赏100万“捉拿”司机;手机QQ又宕机;中兴手机或将出售 | CSDN 极客头条...
  8. C#绘图双缓冲技术总结(转)
  9. 指令 出厂_CNC数控加工中心编程指令详解
  10. 科来网络分析系统11.1(技术交流免费版)
  11. MySQL错误Got error -1 from storage engine
  12. 电脑锁屏壁纸提取方法
  13. 关于华为应用市场审核App无法启动的问题
  14. 页面自动获取导入excel内容
  15. 第七章 本源时空(补充)
  16. JetPack Room数据库组件使用方式
  17. IBM小型机维护经验2则
  18. android手势控制动画,轻松实现Android,iOS的一个手势动画效果
  19. 小程序+音视频1:live-pusher
  20. 【高等数学】三.一元函数积分学

热门文章

  1. Java向前引用容易出错的地方
  2. Appium移动自动化测试(一)--安装Appium(转)
  3. 已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭
  4. 基本排序算法之4——归并排序mergesort
  5. 用python做mud
  6. 阿里开发者们的第5个感悟:听话,出活
  7. SpringBoot-AOP切面处理
  8. python 字典操作
  9. fixedBox固定div漂浮代码 支持ie6以上大部分浏览器
  10. HttpServletRequest常用获取URL的方法