目录

  • 红黑树的特性
  • 第一步,画2-3-4树。
  • 第二步,用这棵2-3-4树,画红黑树。
  • 彩蛋

红黑树的特性

1.每个节点不是红色就是黑色
2.根节点是黑色
3.每个叶子节点(NIL节点,空节点)是黑色的
4.如果一个节点是红色的,则他的子节点必须是黑色的
5.从一个节点到该节点的所有子孙节点的所有路径上包含相同数目的黑色节点

根据这5个特性,我们以{1,2,3,4,5,6,7,8,9,10,11}为例,画一个红黑树。

第一步,画2-3-4树。

2-3-4树可参考文章:
https://wenku.baidu.com/view/9ed57eb584254b35effd343a.html

从下往上开始画2-3-4树:先将1放入最底层,然后放入234。
此时,1234超过了三个节点,需要将中间的节点(2或3)提上去。

本文选择将3提上去。(2和3都可以)

将小于3的,放到3的左边;大于3的,放到3 的右边。

依次插入4,5,6,7。同理,满4个节点,提上去中间的一个(5或6)。

此时,出现了问题。4在3和5之间,因此要把4放到中间。如下图所示。

像这样我们依次加入9,10,11。最终得到2-3-4树。

到了这里,距离你成功画出红黑树,只有一步之遥。


第二步,用这棵2-3-4树,画红黑树。

看一下红黑树的特征,根据这五个特征自己先尝试一下。

1.每个节点不是红色就是黑色
2.根节点是黑色
3.每个叶子节点(NIL节点,空节点)是黑色的
4.如果一个节点是红色的,则他的子节点必须是黑色的
5.从一个节点到该节点的所有子孙节点的所有路径上包含相同数目的黑色节点

先把2-3-4树中,1和2,7和9,10和11,这几个在一起的节点拆开。(原理可参考平衡二叉树的旋转,步骤很简单,此处略去)拆开后的树,如下图所示。【不止一种拆法】

然后看特征3,给叶子节点加个空节点看特征2,根节点是黑色。

看特征5,从一个节点到该节点的所有子孙节点的所有路径上包含相同数目的黑色节点。(这个是找红黑节点的关键)
建议从下往上看,先看1→3,4→3。

  • 1→3:NIL,1,2,三个黑色节点。
  • 4→3:NIL,4,两个黑色节点。
    因此,1→3中,必须减少一个黑色节点(将1个黑变为红—特征1)。
    此时就要看特征4了,如果一个节点是红色的,则他的子节点必须是黑色的 。根据4,我们要将1变为红,这样1→3,4→3都变成了只有两个黑色节点。

    再看6→9,8→9,10→9,11→9.
  • 6→9:NIL,6,7,三个黑色节点。
  • 8→9:NIL,8,7,三个黑色节点。
  • 10→9:NIL,10,两个黑色节点。
  • 11→9:NIL,11,10,三个黑色节点。
    因此,要将三个黑色节点的变成两个黑色节点。此时,有两种办法。一,选7和11变为红色。二,选6、8、11变为红色。本文选第二种方法。

    看完了,底部到3,和底部到9。继续往上看,所有的NIL到5。(例如:1→5:NIL,1,2,3其中有三个黑色节点)可以看出,所有的NIL到5的黑色节点数相同。此刻的树,符合了红黑树的五条特征,因此得到正确的一个红黑树。

彩蛋

最后一段中提到:

可以看出,所有的NIL到5的黑色节点数相同,均为三个黑(例如:1→5:NIL,1,2,3其中有三个黑色节点)。在不变节点颜色情况下,满足红黑树的特征。 但也可以改变颜色,我们把三个黑改成两个黑(即将3和9改为红色),此时,所有的NIL到5的黑色节点数也是相同的,均为两个黑。这样,我们用最简单的方法,就又得到了一个正确的红黑树。


既然都看到这里啦,那那那,点个赞再走呗ღ( ´・ᴗ・` )ღ!!

【两步】教你学会画红黑树相关推荐

  1. 插画师入门技巧:青丛怎么画?5步教你学会画草丛!

    草丛应该怎么画?草地怎么画?青草怎么画?草原怎么画?学习绘画难吗?怎样才能学好绘画?想必这些都是绘画初学者们经常在想的问题吧,就是不知道如何才能绘画好自己想要的插画,比如说想要画个草丛或者场景,但是却 ...

  2. matlab如何画趋势线,【高清图解】手把手,教你学会画趋势线!

    原标题:[高清图解]手把手,教你学会画趋势线! 点击标题下「每天一个K线炒股技巧」可快速关注 大家好,这里是老司机原创的股票知识:每天一个K线炒股技巧.今天的两篇文章为前面讲过的基础知识,今天来做个复 ...

  3. 计算机修图教程,电脑修图太复杂 3步教你学会用手机做肤色后期

    电脑修图太复杂,学不会?没关系,现在手机软件也很强大.只要掌握调色原理,无论是电脑,还是手机通通没有问题. 羡慕我照片中的人像肤色白皙,红润有光泽?没关系,现在就传你手机后期肤色通透大法!三步搞定,直 ...

  4. 只需两步,教你正确识别百度蜘蛛

    经常听到站长们问,百度蜘蛛是什么?最近百度蜘蛛来的太频繁服务器抓爆了,最近百度蜘蛛都不来了怎么办,还有很多站点想得到百度蜘蛛的IP段,想把IP加入白名单,但IP不固定,这些百度方面并未透露相关信息. ...

  5. 两步教你Linux修改主机名

    Linux修改主机名,网上许多教程写的都比较复杂,什么又要修改网络配置.hosts等. 实际上Linux修改主机名可简单通过如下两步完成: 1.临时性修改Linux主机名:hostname 新主机名 ...

  6. 怎么画学计算机的男孩形象,怎么一步一步教大班幼儿画自己的画像:小男孩简笔画(步骤图解)...

    幼儿学画人物,不必强求比例的合理性,可以画一个超大的头部,方便幼儿在头部里面画人物的五官.头发等等,而且大头画看起来非常有趣,又能确保有可爱的效果. 怎么画小男孩简笔画 画小男孩简笔画步骤 1.用铅笔 ...

  7. 两分钟教你学会视频添加滚动字幕并调整色调

    视频剪辑时经常会给一些视频添加滚动字幕,需要调整色调,如何快速剪辑呢?这里给大家分享简单实用的小工具,快速学会剪辑多个视频,一起来试试吧. 在电脑上下载"媒体梦工厂"进入主界面&q ...

  8. 两步教你用Vue3+TS实现input组件的v-model属性

    实现自定义input组件的v-model属性 前言 第一步 第二步 效果 前言 使用过一些ui框架的同学应该都知道input里面的值有一个绑定的v-model属性,这篇文章教大家如何给自己定义的inp ...

  9. github的python代码怎么跑_python程序员一步两步教你使用GitHub!

    作为一个Python爬虫师一步步教你们怎么把代码放入到github 中! 首先呢我们下载一个git的客户端 学习Python中有不明白推荐加入交流群号: 前面548中间377后面875 群里有志同道合 ...

最新文章

  1. ionic + cordova+angularJs 搭建的H5 App完整版总结
  2. 编写fun函数判断字符串尾部的*号,若多于指定数量,则删除多余的;否则,不做操作
  3. Linux疑难杂症解决方案100篇(二十)-万字长文带你读懂正则表达式(建议收藏)
  4. csrf攻击原理与解决方法_信息安全之CSRF攻击
  5. 一个简单的epoll测试例子
  6. 同步服务老是报错_悬而未决:MYSQL配置好主从同步后没有报错,但数据一直没有同步过来是什么原因? | 学步园...
  7. 【CodeForces - 467C】George and Job(dp,思维)
  8. WAMP本地环境升级php版本操作步骤(详细)
  9. C#LeetCode刷题之#155-最小栈(Min Stack)
  10. vb全局热键的写法(占很少的资源)
  11. python与Labview进行数据通信(UDP)
  12. VS2015 编译libevent库
  13. 前端使用js压缩图片上传
  14. 通过网易云歌单链接下载网易云歌曲
  15. 神秘的乌克兰地狱之门
  16. mysql端口establish_establish_connection使用方法
  17. PDF文件怎么编辑,如何删除其中一页
  18. WinCC 7.3 + SQL server(杂)
  19. pychram+python 看源码: 按住crtl,点击函数
  20. ubuntu 下最简单的歌词软件osdlyric (with banshee)

热门文章

  1. html两个圆相交,Word怎么将两个圆交叉重叠部分填充阴影?
  2. Mybatis源码分析(一)Mybatis 基本使用
  3. Linux命令 - pwd命令
  4. iOS开发 UIImage图片拼接
  5. 在命令提示符中运行java代码
  6. 港科大教授权龙:三维视觉重新定义人工智能安防
  7. 网易极客战记官网codecombat|当算法进入游戏,解开用代码画画的奥秘!
  8. ubuntu 卸载 python2 安装python3 opencv
  9. 电信物联卡网络怎么样_三大运营商物联卡有什么不同,选择哪家的最实惠!
  10. HTTPS的工作流程