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

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

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

二叉查找树(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. Hibernate配置详解
  2. 清华教授沈向洋:创新就要做到极致,用开源的方式培养未来的工程师
  3. 【转载】安卓开发者在使用deepin15.4时可能会遇到的问题
  4. Nginx(零):背景
  5. python 课后作业_python 学习笔记 五 课后作业
  6. finally块的return语句会覆盖其他语句的return
  7. jQuery Mobile开发的新闻阅读器,适应iphone和android手机
  8. 在过程中要正式批准可交付成果_PMP项目管理考试试题及答案解析 -
  9. 测试笔记本续航的软件,续航时间测试和总结
  10. 批处理 使用Win7照片查看器
  11. 热招 | 我们是 Towhee 产研团队
  12. android 备份游戏数据,用于Android游戏存档备份和存档还原的教程(图形中的详细信息)...
  13. 最新的全球78707个主要城市数据库,包含经纬度坐标值国家省份
  14. pretraining+fine tuning
  15. 张勋说:简述棒磨机的工作运行原理和磨损机制(图文)
  16. Conversion
  17. 小米12SUltra和小米11SUltra有什么区别 两者配置对比
  18. MySQL-生成随机数
  19. 【LSSVM回归预测】基于matlab麻雀算法优化LSSVM回归预测【含Matlab源码 1128期】
  20. iptables介绍和使用

热门文章

  1. 分布式消息队列如何保证消息有且仅被消费一次?
  2. Adobe illustrator有没有45度对齐
  3. ps自学之路——初始化ps
  4. The disadvantages of an elite education精英教育的弊端
  5. 华为荣耀路由如何虚拟服务器,华为荣耀路由Pro无线桥接怎么设置
  6. 移远通信助力夏粮存储新招式,科技手段更有效
  7. 中国车辆齿轮行业市场需求现状与前景规模预测报告2022-2028年
  8. E. XOR Guessing(Meet in the Middle)
  9. Kubernetes-主要概念-Job
  10. HDU 6286 2018