来源:伯乐专栏作者/玻璃猫,微信公众号 - 程序员小灰

好文投稿, 请点击 → 这里了解详情

————————————

二叉查找树(BST)具备什么特性呢?

1.左子树上所有结点的值均小于或等于它的根结点的值。

2.右子树上所有结点的值均大于或等于它的根结点的值。

3.左、右子树也分别为二叉排序树。

下图中这棵树,就是一颗典型的二叉查找树:

1.查看根节点9:

2.由于10 > 9,因此查看右孩子13:

3.由于10 < 13,因此查看左孩子11:

4.由于10 < 11,因此查看左孩子10,发现10正是要查找的节点:

假设初始的二叉查找树只有三个节点,根节点值为9,左孩子值为8,右孩子值为12:

接下来我们依次插入如下五个节点:7,6,5,4,3。依照二叉查找树的特性,结果会变成什么样呢?

1.节点是红色或黑色。

2.根节点是黑色。

3.每个叶子节点都是黑色的空节点(NIL节点)。

4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)

5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

下图中这棵树,就是一颗典型的红黑树:

什么情况下会破坏红黑树的规则,什么情况下不会破坏规则呢?我们举两个简单的栗子:

1.向原红黑树插入值为14的新节点:

2.向原红黑树插入值为21的新节点:

由于父节点22是红色节点,因此这种情况打破了红黑树的规则4(每个红色节点的两个子节点都是黑色),必须进行调整,使之重新符合红黑树的规则。

变色:

为了重新符合红黑树的规则,尝试把红色节点变为黑色,或者把黑色节点变为红色。

下图所表示的是红黑树的一部分,需要注意节点25并非根节点。因为节点21和节点22连续出现了红色,不符合规则4,所以把节点22从红色变成黑色:

但这样并不算完,因为凭空多出的黑色节点打破了规则5,所以发生连锁反应,需要继续把节点25从黑色变成红色:

此时仍然没有结束,因为节点25和节点27又形成了两个连续的红色节点,需要继续把节点27从红色变成黑色:

左旋转:

逆时针旋转红黑树的两个节点,使得父节点被自己的右孩子取代,而自己成为自己的左孩子。说起来很怪异,大家看下图:

图中,身为右孩子的Y取代了X的位置,而X变成了自己的左孩子。此为左旋转。

右旋转:

顺时针旋转红黑树的两个节点,使得父节点被自己的左孩子取代,而自己成为自己的右孩子。大家看下图:

图中,身为左孩子的Y取代了X的位置,而X变成了自己的右孩子。此为右旋转。

我们以刚才插入节点21的情况为例:

首先,我们需要做的是变色,把节点25及其下方的节点变色:

此时节点17和节点25是连续的两个红色节点,那么把节点17变成黑色节点?恐怕不合适。这样一来不但打破了规则4,而且根据规则2(根节点是黑色),也不可能把节点13变成红色节点。

变色已无法解决问题,我们把节点13看做X,把节点17看做Y,像刚才的示意图那样进行左旋转:

由于根节点必须是黑色节点,所以需要变色,变色结果如下:

这样就结束了吗?并没有。因为其中两条路径(17 -> 8 -> 6 -> NIL)的黑色节点个数是4,其他路径的黑色节点个数是3,不符合规则5。

这时候我们需要把节点13看做X,节点8看做Y,像刚才的示意图那样进行右旋转:

最后根据规则来进行变色:

如此一来,我们的红黑树变得重新符合规则。这一个例子的调整过程比较复杂,经历了如下步骤:

变色 -> 左旋转 -> 变色 -> 右旋转 -> 变色

几点说明:

1. 关于红黑树自平衡的调整,插入和删除节点的时候都涉及到很多种Case,由于篇幅原因无法展开来一一列举,有兴趣的朋友可以参考维基百科,里面讲的非常清晰。

2.漫画中红黑树调整过程的示例是一种比较复杂的情形,没太看明白的小伙伴也不必钻牛角尖,关键要懂得红黑树自平衡调整的主体思想。

转载自:http://www.sohu.com/a/201923614_466939

漫画算法:什么是红黑树?相关推荐

  1. 【算法漫画】什么是红黑树?(下篇)

    上周,我们初步介绍了红黑树存在的意义,以及红黑树的插入操作,没看过的小伙伴可以点击下面链接: 漫画:什么是红黑树? 今天,我们来继续介绍红黑树的删除操作,以及红黑树和其他平衡二叉树的比较. 二叉查找树 ...

  2. 【数据结构和算法05】 红-黑树(转发)

    2019独角兽企业重金招聘Python工程师标准>>> [数据结构和算法05] 红-黑树(看完包懂~) 置顶 2016年04月13日 15:50:25 eson_15 阅读数:526 ...

  3. 漫画:什么是红黑树?(下篇)

    作者 | 小灰 来源 | 程序员小灰(ID:chengxuyuanxiaohui) 上周,我们初步介绍了红黑树存在的意义,以及红黑树的插入操作,没看过的小伙伴可以点击下面链接: 漫画:什么是红黑树? ...

  4. 算法导论 之 红黑树 - 添加[C语言]

    作者:邹奇峰 邮箱:Qifeng.zou.job@hotmail.com 博客:http://blog.csdn.net/qifengzou 日期:2013.12.24 21:00 转载请注明来自&q ...

  5. 《算法导论》红黑树详解(一):概念

    在学习红黑树之前,读者应先掌握二叉查找树的相关知识.学习红黑树或者二叉查找树,推荐大家看<算法导论>.<算法导论>原书第3版 高清PDF 带详细书签目录下载 密码:acis & ...

  6. 【算法漫画】什么是红黑树?

    文章来源于程序员小灰,作者小灰 最近,小灰把这个知识点重新做了总结,分成上下两篇,希望大家把红黑树这个重要的数据结构彻底吃透. -----  第二天  ----- ------------ 二叉查找树 ...

  7. 漫画:什么是红黑树?

    本文经授权转载自公众号程序员小灰 (ID:chengxuyuanxiaohui) ------------ ------------ 二叉查找树(BST)具备什么特性呢? 1.左子树上所有结点的值均小 ...

  8. 算法-查找(红黑树)

    查找 符号表 最主要的目的是将一个键和一个值联系起来.用例能够将一个键值对插入符号表并希望在之后能够从符号表的所有键值对中按照键直接找到对应的值,即以键值对为单元的数据结构. 无序链表顺序查找 性能: ...

  9. 算法手札二:红黑树的插入原理,原理与实现篇

    红黑树的五大性质(性质四与性质五特别重要) 1. 节点必须是红色或者是黑色 2. 根节点是黑色的 3. 所有的叶子节点是黑色的. 4. 每个红色节点的两个子节点是黑色的,也就是不能存在父子两个节点全是 ...

  10. 算法导论之红黑树的学习

    最近学习了二叉搜索树中的红黑树,感觉收获颇丰,在此写一篇文章小结一下学到的知识,顺便手写一下Java代码. 1.引言 先来讲讲什么是二叉搜索树,二叉搜索树有如下特点:他是以一颗二叉树(最多有两个子结点 ...

最新文章

  1. android支付宝调用
  2. pandas使用apply函数和lambda函数、把所有行指定的数据列进行相加(use apply and lambda to add value in dataframe rows)
  3. 蓝桥杯- 图形显示(java)
  4. JSPatch – 动态更新iOS APP
  5. OpenGL transformation变换的实例
  6. JfreeChart(八)之甘特图
  7. Redis中三种特殊数据类型
  8. P11:经典卷积神经网络结构案例分析
  9. 凉凉了,Eureka 宣布闭源,Spring Cloud 何去何从?
  10. bzoj 3209: 花神的数论题 喵哈哈村的秘境探险(四)
  11. jsf标签_JSF Facelet标签示例教程
  12. 58java面试题_58到家,java开发实际面试题
  13. 51单片机数值存储c语言教程,单片机c语言教程:C51变量
  14. 《码出高效---java》PDF,有学习java的小伙伴可以看看,阿里巴巴出版的书籍
  15. 设计师工资低?10大网站助你快速涨1万身价
  16. 用Python对PDF文字颜色加深
  17. 网络运维与安全岗位月薪2.5w,您还不知道的前景!
  18. ABP开发框架的总体介绍
  19. SQLite学习笔记(七)-- 数据插入、更新和删除(C++实现)
  20. YOLOv5-7.0解决No module named ‘utils.datasets‘和cannot import name ‘scale_coords‘ from ‘utils.general‘

热门文章

  1. NCH WavePad for Mac(音频编辑软件)
  2. 触动精灵学习笔记(1)
  3. 华为开发者工具 DevEco Studio 配置 SDK 教程
  4. OCP 1Z0 052 83
  5. Windows10-64bit,vs2015,借助OpenCV、Zbar、Tesseract(编译环境32bit)进行数字、条形码识别。
  6. 一种采用耐高压变压器油和超导金属导线的变压器
  7. presto + kafka + logstash 实时监控分析nginx日志
  8. 鸿蒙磅礴不可以涯际夕 四,山中之路不知何年始开辟,羊肠萦纡孰得以形状,险巇可畏惊尘寰。...
  9. K近邻抠图(KNN matting)
  10. Typora 的下载安装 简单使用