红黑树

1. 简介

红黑树(RBT)性质
  ①、结点非红即黑;
  ②、根节点是黑色;
  ③、所有 NULL 结点称为叶子节点,且认为颜色为黑;
  ④、所有红节点的子结点都为黑色;
  ⑤、从任一结点到其叶子节点的所有路径上都包含相同数目的黑结点。

红黑树

图上有 NIL 的为叶子节点,也可以使用一般的叶子节点,但会使算法更复杂。

所有性质 1 ~ 5 合起来约束了该树的平衡性能

红黑树上的最长路径不可能大于 2 倍最短路径。

由第 ① 条和第 ④ 条可以确定:从一个结点到其叶子节点的一条最长的路径一定是红黑交错的,而最短路径一定是纯黑色的结点;再结合第 ②、③ 条可知:最长路径 <= 2 * 最短路径。

一颗二叉树的平衡性能越好,那么它的效率越高!显然红黑树的平衡性能比 AVL 略差些。实际上红黑树的效率仍能达到 O(log2N)。

2. 插入

插入点不能为黑结点,那样将破坏性质 ⑤,所以应插入红结点。

如果它的父结点是红的,就会破坏性质 ④,所以要做 "旋转" 操作和一些节点的变色。

为了叙述方便,给要插入的节点标为 N(红),父节点为 P,祖父节点为 G,叔节点为 U。

插入情形
1、该树为空树,直接插入根结点的位置,违反性质 ①,把结点颜色改为黑。

2、插入结点 N 的父结点 P 为黑色,不违反任何性质,无需做任何修改。

3、N、P、U 都为红,这里不论 P 是 G 的左孩子,还是右孩子;不论 N 是 P 的左孩子,还是右孩子。

情形 3

操作:如图把 P、U 改为黑色,G 改为红色,未结束。

解析:N、P 都为红,违反性质 ④;若把 P 改为黑,符合性质 ④,显然左边少了一个黑节点,违反性质 ⑤;所以把 G、U 都改为相反色,这样一来通过 G 的路径的黑节点数目没变,即符合 ④、⑤,但是 G 变红了,若 G 的父节点又是红的不就又违反了 ④。所以经过上边操作后未结束,需把 G 作为起始点,即把 G 看做一个插入的红节点继续向上检索----属于哪种情况,按那种情况操作~要么中间就结束,要么直到根结点,如果根节点变红,因为无法再向上检索,那就把它变为黑色。

4、N、P 为红,U 为黑,P 为 G 的左孩子,N 为 P 的左孩子(或者 P 为 G 的右孩子,N 为 P 的右孩子;反正就是同向的)。

情形 4

操作:如图 P、G 变色,P、G 变换即左左单旋(或者右右单旋),结束。

解析:要知道经过 P、G 变换(旋转),变换后 P 的位置就是当年 G 的位置,所以红 P 变为黑,而黑 G 变为红都是为了不违反性质 ⑤,而维持到达叶节点所包含的黑节点的数目不变!

记忆法:也就是相当于把红 N 头上的红节点移到对面黑 U 的头上;这样即符合了性质 ④ 也不违反性质 ⑤。

5、N、P 为红,U 为黑,P 为 G 的左孩子,N 为 P 的右孩子(或者 P 为 G 的右孩子,N 为 P 的左孩子;反正两方向相反)。

情形 5

操作:需要进行两次变换(旋转),图中只显示了一次变换-----首先 P、N 变换,颜色不变;然后就变成了情形 4 的情况,按照情况 4 操作,即结束。

解析:由于 P、N 都为红,经变换,不违反性质 ⑤;然后就变成 4 的情形,此时 G 与 G 现在的左孩子变色,并变换,结束。

3. 删除

需先找到“替代点”来替代删除点而被删除,也就是删除的是替代点

替代点 N 的至少有一个子节点为 NULL,可以通过一直查找 lChild 指针来确定 N

若 N 为红色,则 N 的另一个节点 M 也为 NULL,那么直接把 N 删了,不违反任何性质,结束;

若 N 为黑色,N 的另一个节点 M 不为 NULL,则 M 一定是红色的,且 M 的子节点都为 NULL,那么把 N 删掉,M 占到 N 的位置,并改为黑色,不违反任何性质,结束;

若 N 为黑色,N 的另一个节点 M 也为 NULL,则把 N 删掉,该位置置为NULL,显然这个黑节点被删除了,破坏了性质 ⑤,那么要以 N 节点为起始点检索看看属于以下那种情况,并作相应的操作。

N 为黑点,P 为父节点,S 为兄弟节点

删除情形
1、S 为红色(父节点 P 一定是黑,子节点一定是黑),N 是 P 的左孩子(或者 N 是 P 的右孩子)。

情形 1

操作:P、S 变色,并交换----相当于 AVL 中的 RR 型旋转,即以 P为中心S向左旋(或者是 AVL 中的 LL 型旋转),未结束。

解析:P 的左边将要少一个黑节点,这样操作相当于在 N 头上又加了一个红节点----不违反任何性质,但是到通过 N 的路径仍少了一个黑节点,需要再对 N 进行一次检索,并作相应的操作才可以平衡。

2、P、S 及 S 的孩子们都为黑。

情形 2

操作:S 改为红色,未结束。

解析:S 变为红色后,经过 S 节点的路径的黑节点数目也减少了 1,那个从 P 出发到其叶子节点到所有路径所包含的黑节点数目(记为num)相等了。但是这个num 比之前少了 1,因为左右子树中的黑节点数目都减少了!一般地,P 是他父节点 G 的一个孩子,那么由 G 到其叶子节点的黑节点数目就不相等了,所以说没有结束,需把 P 当做新的起始点开始向上检索。

3、P 为红(S一定为黑),S 的孩子们都为黑。

情形 3

操作:P 改为黑,S 改为红,结束。

解析:这种情况最简单了,既然 N 这边少了一个黑节点,那么 S 这边就拿出了一个黑节点来共享一下,这样一来,S 这边没少一个黑节点,而 N 这边便多了一个黑节点,这样就恢复了平衡,多么美好的事情哈!

4、P 任意色,S 为黑,N 是 P 的左孩子,S 的右孩子 SR 为红,S 的左孩子任意(或者 N 是 P 的右孩子,S 的左孩子为红,S 的右孩子任意)。

image.png

操作:SR(SL)改为黑,P 改为黑,S 改为 P 的颜色,P、S 变换--这里相对应于AVL 中的 RR 型旋转(或者是 AVL 中的 LL 型旋转),结束。

解析:P、S 旋转有变色,等于给 N 这边加了一个黑节点,P 位置(是位置而不是 P)的颜色不变,S 这边少了一个黑节点;SR 有红变黑,S 这边又增加了一个黑节点;这样一来又恢复了平衡,结束。

5、P 任意色,S 为黑,N 是 P 的左孩子,S 的左孩子 SL 为红,S 的右孩子 SR 为黑(或者 N 是 P 的有孩子,S 的右孩子为红,S 的左孩子为黑)。

[图片上传失败...(image-d4cc88-1541757598159)]

操作:SL(或SR)改为黑,S改为红,SL(SR)、S变换;此时就回到了情形4,SL(SR)变成了黑 S,S 变成了红 SR(SL),做情形 4 的操作即可,这两次变换,其实就是对应 AVL 的右左的两次旋转(或者是 AVL 的左右的两次旋转)。

解析:这种情况如果你按情形 4 的操作的话,由于 SR 本来就是黑色,你无法弥补由于 P、S 的变换(旋转)给 S 这边造成的损失!所以没先对 S、SL 进行变换之后就变为情形 4 的情况了,何乐而不为呢?

强调的是:注意哪些分方向的情况,每个分方向的情形就两种情况,不要搞迷了!

4. 红黑树旋转

左旋
右旋

5. 红黑树与 AVL 树的区别

红黑树和平衡二叉树类似,都是在进行插入和删除操作时通过特定旋转保持二叉查找树的平衡,从而获得较高的查找性能。

区别:平衡二叉树追求的是全局平衡,而红黑树只追求局部平衡,因此在操作时对红黑树的平衡调整更高效。红黑树并不是严格意义上的左右子树深度差不大于 1,但它依然保持平衡,并保持好的查找时间复杂度。

红黑树在任何不平衡状态下都会在 3 次旋转之内解决,而平衡二叉树追求绝对平衡,旋转次数不可预算。红黑树调整平衡通过变色或旋转。

6. 红黑树的使用

TreeMap、TreeSet、JDK8 HashMap。

AVL 树:最早的平衡二叉树之一。应用相对其他数据结构比较少。windows 对进程地址空间的管理用到了 AVL 树。

红黑树:平衡二叉树,广泛用在 C++ 的 STL 中。如 map 和 set 都是用红黑树实现的。

B/B+ 树:用在磁盘文件组织 数据索引和数据库索引。

Trie 树(字典树):用在统计和排序大量字符串,如自动机。

7. 学习文章

_Never_ # 红黑树
_Never_ # 平衡二叉树
维基百科
红黑树比 AVL 树具体更高效在哪里?
漫画:什么是红黑树?
小黑妹007 # TreeMap的实现

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