作为一种数据结构,红黑树可谓不算朴素,因为各种宣传让它过于神秘,网上搜罗了一大堆的关于红黑树的文章,不外乎千篇一律,介绍概念,分析性能,贴上代码,然后给上罪恶的一句话,它最坏情况怎么怎么地...

1.查找-在高度不在宽度对于查找而言,如果一棵二叉树的高度是N,那么最多可以在N步内完成查找,这个不用解释,解释这个有点喧宾夺主了,

2.二叉树的不平衡根源一棵树在查找看来变得不平衡是因为子树的高度相差很大。

3.多叉树-宽度换高度在第1节以及第2节,我们已经知道,树的宽度越大,高度越小,这样查询起来越快,Cisco路由器里不是有256叉乃至1024叉树吗?但是这样真的很好吗?对于稀疏节点,这样会严重消耗内存。

4.权衡-2,3树我们发现,道生一,一生二,二叉树是一个完美的开始,但是我们发现它特别容易倾斜,倾斜的时候别触摸。我们也不能一下子就上256叉树,即使那样在海量节点情况下也抗不住,因此这种盲目宽度换高度的方案没有可扩展性。我们需要找出一种动态的机制,让一棵树动态调整保持平衡。

5.2-3树的平衡变换如果是二叉树,那么你插入一个节点,你只有最多1次机会保持子树的高度不变,如果是一个三叉树,那么就有2次机会。现在开始,我们为二叉树添了一叉,变成了三叉树。

1).插入的新叶子节点的父节点是一个二叉节点这种情况最简单,二叉节点变三叉节点即可,如下图所示:

vc+4tNTToaPK99fcysfSqrOkuN+1xKOssaOz1sa9uuK1xLe9yr2+zcrHzazKsbOkuN+jrLb41eLKx7K7v8nE3LXEo6yy5cjr0ru49r3atePWu8TcyMO4w73atePL+dTatcTX08r3s6S436GjyLu2+KOsyOe5+8TcvavV4rj20MXPosnPyf21vbj5sr+jrNTauPmyv7OkuN+jrL7NyrXP1sHLobDNrMqxs6S436Gxo6E8YnIgLyZndDsgICAgICAgu7nKx9Gt18XJz8PmtcTEx7j2y7zCt6OsztLDx7zM0PjU9rzTyvey5rXEyv3Bv6OsztLDx7DRy/zU9rzTtb00o6HQwr3ateO1xLLlyOvI58/CzbzL+cq+o7o8YnIgLyZndDs8YnIgLyZndDs8aW1nIHNyYz0="https://img-blog.csdn.net/20150627234418953?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZG9nMjUw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="\" />

很遗憾,没有完成任务,但是最终我们提出了两个问题,只要解决了这两个问题,所有问题就解决了,真正理解红黑树,真正的(Linux内核里大量用到的数据》(https://www.unjs.com)。解决这两个问题,无疑都要牵扯到节点P的父节点以及再往上的节点,有两种可能:

可能性1:P的父节点PP是一个二叉节点

问题2解决。可能性2:P的父节点PP是一个三叉节点

最后,我们发现,在递归的过程中,要么碰到了P..P是个二叉节点,此时按照问题2的解决方式将当前节点的值直接提到P...P中,其子树降低一个高度,抵消增加的高度,平衡保持,递归结束,要么递归到了根节点,此时只需要一个分裂操作即可完美结束!

6.演进到红黑树很显然,通过上面的描述,我们似乎找到了一个使树保持平衡的方案,而且是相当完美的平衡!核心就是宽度和高度之间的博弈。我们总是可以用一个宽度抵消一层高度,整个过程就是一次或者多次的一加一减,最终的结果还是0!

看到了吧,红色节点就是从2-3树中分出来的,为了维持一棵二叉树而不是2-3树,必须将三叉节点变成二叉节点,这是一个宽度换高度得回退,即高度换宽度,当然代价就是不再完美平衡。按照以上的这个变换,你自己试试看,可以变出两个连续的红节点吗?NO!还在纠结红黑树的性质概念吗?看了它的演进,你会发现,很多红黑树的复杂概念和让人没有头绪的性能都是自然而然的。下面我们来看一下它的最坏情况是什么。

还是以2-3树分析,如果在一棵2-3树中,最左边路径上的节点全部是三叉节点,而最右边路径上的节点都是二叉节点,那么把它变换成二叉红黑树之后,就会发现最左边的路径上是红黑间隔的节点,而最右边的路径上全部是黑节点,它们的高度差接近2倍。出现这样的情况是令人悲哀的,但是也是极低概率的。

红黑树的所有包括旋转等操作,都可以映射到2-3树中,而我们对2-3树以及高度和宽度之间的博弈已经足够理解了。请再次去理解红黑树吧,再看看它的性质和概念,together with左旋和右旋,是不是有一种新的体会呢?

linux红黑树节点没有数据,真正理解红黑树,真正的(Linux内核里大量用到的数据 -电脑资料...相关推荐

  1. 真正理解红黑树,真正的

    作为一种数据结构,红黑树可谓不算朴素,因为各种宣传让它过于神秘,网上搜罗了一大堆的关于红黑树的文章,不外乎千篇一律,介绍概念,分析性能,贴上代码,然后给上罪恶的一句话,它最坏情况怎么怎么地...    ...

  2. 红黑树与平衡二叉树_百图详解红黑树,想不理解都难

    之前在公司组内分享了红黑树的工作原理,今天把它整理下发出来,希望能对大家有所帮助,对自己也算是一个知识点的总结. 这篇文章算是我写博客写公众号以来画图最多的一篇文章了,没有之一,我希望尽可能多地用图片 ...

  3. 红黑树与平衡二叉树_百图详解红黑树

    之前在公司组内分享了红黑树的工作原理,今天把它整理下发出来,希望能对大家有所帮助,对自己也算是一个知识点的总结. 这篇文章算是我写博客写公众号以来画图最多的一篇文章了,没有之一,我希望尽可能多地用图片 ...

  4. Linux内核中段伪例,利用Linux内核里的Use-After-Free(UAF)漏洞提权

    *本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担. * 作者:nickchang 上个月爆出的CVE-2016-0728 (http: ...

  5. linux select读取节点数据失败_MySQL中覆盖索引查询和select*查询执行结果案例分析...

    索引优化建议 在MySQL中要尽可能使用覆盖索引进行检索,只访问索引的查询(索引列和查询列一致),减少select * 可提高查询效率 覆盖索引(Covering Index) 理解方式一: 就是se ...

  6. linux文件 i节点结构,Linux 文件描述符 文件表项 i节点结构

    Linux的VFS(虚拟文件系统)学习起来很痛苦,看源码不太明智,看完分析完就忘且太浪费时间,懂了后也无法应用在实际场合中.所以这里只是讨论下文件描述符,文件表项(file结构体)和inode,理清实 ...

  7. linux vfs 根节点名称,Linux:文件,目录项,索引节点,超级块,VFS,具体文件系统...

    [笔记:http://m.blog.csdn.net/blog/zhouzhou135] 在了解文件系统之前,先了解磁盘格式化的知识. 所以要理解文件系统的数据结构,要从两个方向来理解: 1:磁盘中的 ...

  8. linux文件i节点,深入理解linux中i节点(inode)

    对于Unix系列的操作系统,大多都有v节点.但是对于linux来说,只有通用的i节点,却没有v节点. 下面来探讨一下,linux下的i节点. linux中,文件查找不是通过文件名称来查找的.实际上是通 ...

  9. linux can总线接收数据串口打包上传_【Linux应用】CAN总线编程

    1 CAN总线简介 CAN是控制器局域网络(Controller Area Network,CAN)的简称,由德国BOSCH公司开发,并最终成为国际标准(ISO 11898-1).CAN总线主要应用于 ...

最新文章

  1. 仿桌面通知pnotify插件
  2. 十大成长型机器人技术大盘点
  3. 宿松长铺程集高中2021年高考成绩查询,2017宿松程集中学录取分数线(附2017高考成绩喜报)...
  4. shell中$XX相关
  5. 如何解决Http请求参数中加号变空格问题
  6. OpenCV SVM支持向量机和KNearest数字识别的实例(附完整代码)
  7. php打印矩阵,PHP实现顺时针打印矩阵(螺旋矩阵)的方法示例
  8. java 策略模式 促销_java设计模式——策略模式
  9. php会员可见内容代码,DedeCMS内容隐藏指定字段仅对会员显示对游客不可见的实现方法...
  10. (转载)解决eclipse安装maven的问题:Unable to update index for central|http://repo1.maven.org/maven2...
  11. JavaWeb——AOP
  12. TCP三次握手四次挥手介绍
  13. Javascript实践-Function对象扩展之延时执行函数
  14. DMS经销商管理系统解决方案
  15. java 国际化 i18n
  16. 用Ps按比例缩小图片整体的尺寸
  17. tvp5150 gm7150配置
  18. “大牌”纷纷入驻智能家居,小米能否守住高地?
  19. 【Java中的构造器(构造方法)_基本语法_详细解读】
  20. Linux下默认字体是什么,linux默认字体是什么

热门文章

  1. Java中implies_boolean implies(Permission p)
  2. java date 一个月_java中的日期加一个月的计算
  3. 一句话概括自动装箱/拆箱
  4. java在原数组中追加一个元素
  5. oracle 安装乱码,linux安装Oracle中文乱码问题汇总
  6. Java 获取链表的元素
  7. Java 将文件的内容复制到另一个文件
  8. pyqt5生成py的文件为什么是c 语言,如何使用PyQt5在python中创建文件对话框
  9. WordPress文章ajax,使用ajax在WordPress后台删除文章方法
  10. labview实例_手把手以实例教你学LabVIEW编程,条件结构编程方法