红黑树---简单易懂

红黑树,对于很多人来讲都是既熟悉又陌生,每次提到红黑树都会令人头大。我们知道jdk1.8中,hashMap的底层使用了红黑树,那么到底什么是红黑树呢?红黑树的算法又是什么样的呢?

我们平时都会遇到遇到别人买了东西,然后让你猜价格的问题
甲:你猜我买的这个多少钱?
乙:1000
甲: 高了
乙:500
甲:低了:
乙:750
...... 直到最后猜中

这样说呢,可能大家也猜到了是【二分查找法】,通过这个例子呢,主要想引出的是树,看下面的图片:

树.jpg

程序中的树呢,其实是我们日常看到的树的倒影,或者发挥一下想象,倒影也可以是树根

二叉查找树

二叉查找树,Binary Search Tree 「BST」,要想了解二叉查找树呢,首先我们需要了解一下二叉查找树都有哪些特性呢?

  1. 某节点的左子树节点值仅包含小于该节点值
  2. 某节点的右子树节点值仅包含大于该节点值
  3. 左右子树每个也必须是二叉查找树

看个图就轻松理解上面三句话的意思了:

图1.jpg

上图,结合二叉查找树的三条约束来看,非常好,没有什么问题。再来看一个图,依旧符合上面三条约束,感觉有问题吗?

图2.jpg

这是一个走路一米六,一米八的树
这是一个畸形的树,大风一挂很可能被折断的树
从程序的角度来说这个树不够平衡,查找次数或时间复杂度 O(h)可能会随着一条腿长无限增长

理科生在高中学习生物时学过一个关键字「去除顶端优势」,通过去除植物顶端优势,侧芽会迅速生长,慢慢变得强壮和平衡, 红黑树其实就是去除二叉查找树顶端优势的解决方案,从而达到树的平衡

红黑树

红黑树,Red-Black Tree 「RBT」是一个自平衡(不是绝对的平衡)的二叉查找树(BST),树上的每个节点都遵循下面的规则:

  1. 每个节点都有红色或黑色
  2. 树的根始终是黑色的(根节点始终是黑色的)
  3. 没有两个相邻的红色节点(红色节点不能有红色父节点或者红色子节点,并没有说不能出现连续的黑色节点)
  4. 从节点(包括根节点)到其任何后代NULL节点的每条路径都具有相同数量的黑色节点
    (叶子节点下方挂的两个空节点,并且认为他们是黑色的)

可能大家还是很懵逼,不过没事,多练习几次就熟悉了。
红黑树有两大操作:

  1. recolor (重新标记黑色或红色)
  2. rotation (旋转,这是树达到平衡的关键)

我们会先尝试recolor,如果recolor不能达到红黑树的四个要求,然后我们尝试rotation,其实红黑树的关键玩法就是弄清楚recolor和rotation的规则,接下来我们看一下详细的算法公式吧。

假设我们插入的新节点为X

  1. 将新插入的节点标记为红色
  2. 如果X为根节点,则标记为黑色
  3. 如果X的parent不是黑色,并且X也不是root
    3.1 如果X的uncle是红色
    3.1.1 将parent和uncle标记为黑色
    3.1.2 将grand parent(祖父)标记为红色
    3.1.3 将X节点的颜色标记为与X祖父相同

接下来看下图:

图3.jpg

跟着上面的公式走:

  1. 将新节点X标记为红色
  2. 发现X的parent(P)同样为红色,这样违反了红黑树第三条规则[不能有两个连续相邻的红色节点]
  3. 发现X的uncle(U)也是红色的
  4. 将X的parent(P)和uncle(U)标记为黑色
  5. 将X和X的grand parent(G)标记为相同的颜色,即红色,继续重复公式2,3
  6. 发现X的grand parent(G)是根节点,标记为黑色
  7. 结束

上面说的是X的uncle为红色的情况,接下来我们看一下X的uncle为黑色的情况

  1. 如果X的parent不是黑色,并且X也不是root
    3.2 如果X的uncle是黑色,我们要分四种情况处理
    3.2.1 左左情况(P是G的左孩子,X是P的左孩子)
    3.2.2 左右情况(P是G的左孩子,X是P的右孩子)
    3.2.3 右右情况(和 3.2.1 镜像过来,恰好相反,P是G的右孩子,X是P的右孩子)
    3.2.4 右左情况(和 3.2.2 镜像过来,恰好相反,P是G的右孩子,X是P的左孩子)

当uncle节点为黑色的时候,我们第一步考虑的是旋转,这里呢我们可以先不关注红黑树的4个规则,主要是演示如何旋转的。

左左情况

这种情况很简单,想象这是一根绳子,手提起P节点,然后变色即可,如下图:

左左.jpg

变色:X是当前节点,P是X的parent节点,U是X的uncle节点,G是grand parent节点。P节点是根节点变黑色,G变成和X一样的颜色,也就是红色。完成

左右情况

先进行左旋:使X的父节点P被X取代,同时父节点P成为X的左孩子,然后在应用左左情况,如下图:

左右.jpg
右右情况

像左左一样,看成一根绳子。手提起P节点,然后变色即可,如下图:

右右.jpg
右左情况

先右旋:使 X 的父节点 P 被 X 取代,同时父节点 P 成为 X 的右孩子,然后再应用右右情况,如下图:

右左.jpg

通过上述过程,想必大家对红黑树有了一定的了解。以后在提到红黑树的时候,就不会那么头大了。本文参照日拱一兵公众号中的文章"红黑树,超强动静图详解,简单易懂".
参考文章

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容

  • 写在前面 红黑树,对很多童鞋来说,是既熟悉又陌生。学校中学过,只了解大概;工作中不怎么使用,但面试又是重点。每次需...
    日拱一兵阅读 12,231评论 6 16
  • - 简介 红黑树(Red Black Tree) 是一种近似平衡二叉查找树,具有基本二叉树的所有特性的同时,还...
    厦门张明爽阅读 545评论 0 1
  • 红黑树是平衡二叉查找树的一种。为了深入理解红黑树,我们需要从二叉查找树开始讲起。 BST 二叉查找树(Binary...
    kanehe阅读 1,375评论 0 8
  • 1、红黑树介绍 红黑树又称R-B Tree,全称是Red-Black Tree,它是一种特殊的二叉查找树,红黑树的...
    文哥的学习日记阅读 9,870评论 1 35
  • 这个周看算法导论,看到红黑树,看的我云里雾里绕啊。虽然最后看懂了,据我估计,要是过一个星期不看保证忘干净,因此决定...
    充满活力的早晨阅读 1,951评论 0 3