结合2-3-4树理解红黑树(1) —— 概览

红黑树是一种相对平衡的二叉树,它可以在O(log n)时间内做出查找,和二分查找的效率低相似的。它的用途也非常的广泛,就目前Java中HashMap、TreeMap中都有涉及到红黑树到运用,在移动端Android方面,Android的底层Binder架构中也有运用到红黑树来存储binder实体和引用。从理论以及运用场景可见这种树数据结构的效率之高。

性质

这里引用Wikipedia中的定义。

红黑树是每个节点都带有颜色属性的二叉查找树,颜色为红色或黑色。
在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:

1.节点是红色或黑色。
2.根是黑色。
3.所有叶子都是黑色(叶子是NIL节点)。
4.每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点。)
5.从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。

注:如果不明白什么是“二叉查找树”的可以去百度谷歌一下,还是很简单的这里就不赘述了。

首先看着条条框框的约束条件很多其实重要的只有第4条和第5条,也是这两条属性使得红黑树能有一个相对平衡的树形结构。这里上两个红黑树的示例图:

RBTree1-1.png
RBTree1-2.png

如上面两张图,他们都属于红黑树。

第一张例图,从根节点到所有叶子结点的黑色节点数(包括叶子节点)都是3,并且从任一节点到叶子节点到黑色节点数目都相同。树中也没有出现过连续的两个红色节点。满足红黑树的所有性质。

第二张例图比较极端,所有节点都是黑色的但也没有违反红黑树的性质,从根节点到所有叶子结点的黑色结点数都是4,并且没有出现连续的两个红色节点相连接(因为根本就没有红色的节点)。也满足红黑树的所有性质。

2-3-4树的引入

对红黑树有初步了解以后这里再来看看2-3-4树。为什么突然要引入2-3-4树?因为红黑树其实就是2-3-4树的一种体现。这里引入2-3-4树更多的是为了后面对红黑树做插入删除时的对比说明从而更好的理解红黑树的设计思想。如果不理解红黑树的设计思想,后面对红黑树的一系列操作变化都会成为公式形式的记忆,过一段时间就容易忘记。

2-3-4树的定义

首先先简单的说明一下2-3-4树。2-3-4树是一种特殊的多叉查找树,它的每一个节点中可能包含一个两个或者三个数据。2-3-4树不论是在插入还是在删除时都能达到一种实时平衡的效果。下面给出2-3-4树中可能出现的节点类型:

  • 包含一个数据的节点称为2node
  • 包含两个数据的节点称为3node
  • 包含三个数据的节点称为4node

另外2-3-4树任一节点到每个叶子的所有路径包含的节点数都相同(深度相同)。
这里给出一个2-3-4树的示例图,里面包含了2-3-4树中出现的所有节点形式。


2-3-4Tree.png

2-3-4树的插入

2-3-4树的插入可以简单的理解成一种“加法进位”。例如当你按照普通二叉树的插入规则插入节点,最后定位到需要插入到一个指定的节点。普通二叉查找树可能是直接在节点下方添加一个子节点,而2-3-4树当中则会以一种“合并”的方式并入到当前节点当中。正因为这种“合并”操作使得2-3-4树在插入删除时保持实时平衡成为可能,因为每次插入2-3-4树的节点都会有一次判断的机会(可能时并入也可能是分裂(进位)),有了这一次操作就可以将暂时会导致破坏树平衡的新添加的节点“缓存”起来,当“缓存”节点到达一定的数量时就会分裂提升一级树的高度。这就是2-3-4树插入时能够达到实时平衡的核心思想。

下面结合图例来分析2-3-4树插入的具体逻辑(注:图例均选为234树的子树来做分析来减少复杂度)。首先当定位到插入的节点时一个2node(节点中只有一个数据并且拥有两个子节点)时,插入的数据会被“并入到”2node节点当中,然后形成一个3node节点。如下图:


234_insert_1

当被插入的是3node节点时也是一样的,新数据会被“并入”到3node节点中形成4node节点。如下图:


234_insert_2.png

当插入的是4node节点时就需要用到上面提到的“进位”操作了。“进位”的意思就和我们做加法运算时一样,当个位数据相加满十了这时候就要进位到十分位。2-3-4树也是一样的道理,当4node节点再“并入”节点时就会发生“进位”,分裂出一个节点然后插入到父节点当中。稍有不同的地方就是2-3-4树当中为了保证节点的位置是采取先分裂“进位”再插入的操作,具体怎么操作可以看下图:


234_insert_3.png

当然有一种情况是进位以后父节点也已经是4node了,这样就会再次进行一次进位,操作和之前是一样的。这里可以简单的把当前发生进位(被分裂出来)的节点当作是一个新加入的节点加入到父节点中,父节点(即将发生进位)分裂出来的节点也当作新加入的节点加入到祖父节点当中就可以了。简单的说进位可以理解成分裂和插入(至于怎么插入继续套用上面的逻辑),其实就是一种递归,这里就不再上图描述了。

2-3-4树的删除

2-3-4树的插入可以理解为“进位”,那删除就可以理解为“借位”,就比如说当17减8时各位数“减不动”了,这个时候就需要向十分位去“借一位”2-3-4树的删除也是这个道理,当节点自己能。

这里3node、4node的删除就不多做分析,和添加时一样,直接拿掉需要删除的数据就可以了。
这里主要分析一下2node删除时的操作逻辑。

首先第一种情况是向兄弟节点“借位”。有兄弟节点有多余的数据先借过来保证树结构不变,不然这边删除一个节点不就多了一个缺口了,因此这里需要先找兄弟节点借。怎么样的兄弟节点才能算有多余节点的兄弟节点呢?就是一个节点内有多个数据的也就是3node或者4node;借过来以后就可以顺利的删除需要删除的节点而不留“缺口”了。这里简单的说就是合并重分配最后移除。具体操作如下图:


2-3-4Tree_Delete1.png

下面分析另外一种情况就是当兄弟节点没有可以借用的数据了,这个时候就需要找父亲节点去借了。借完以后父亲节点自然就从原来的3node降为2node了,就如同个位不够问十分位借,借完以后十分位减一。具体操作如下图:


2-3-4Tree_Delete2.png

上面讨论的是能够向父亲节点借到数据的情况,那如果借不到那就会向父亲节点的兄弟节点(叔叔节点)借,这个时候你可以简单的理解成当前父亲节点需要删除,然后回到刚刚第一种情况来操作——兄弟能借借兄弟节点的,借不到就问父节点借。这里也是一种递归思想,具体流程图我就不放了,有兴趣可以自己动手画画就很清晰了。

最后可能存在一种极端情况就是递归到根节点仍然借不到数据,这个时候就需要将根节点和两个子节点合并成为一个4node,然后继续做删除借位操作。具体操作如下图:


2-3-4Tree_Delete3.png

这里只分析了两层,其实多层的情况也是一样的。

删除操作相比添加操作稍微有一些复杂,这里做一个小结:删除的核心思想其实就是和减法运算是一样的,当个位不够用时向十位借,十位也不够用的时候就向百位借,就这样循环递归。只不过2-3-4树中的删除操作在借位时多加上一步检查兄弟节点是否有可借用的数据这一步,本质上是一样的。

红黑树和2-3-4树之间的联系

红黑树通过添加颜色这一属性让二叉树拥有了2-3-4树的结构特性,红色节点向上连接的线可以看作是“红线”,而由“红线”相连的多个节点即为一个2-3-4树中的“多node”。因此红黑树也将拥有2-3-4树的“缓存”能力来保证实时的平衡。

红黑树转化为2-3-4树

红黑树转化为2-3-4树的规则就是通过颜色。

  • 红色节点向上的连接线为红线
  • 通过红线连接起来的节点为n-node(n可以是2或者3)

这么形容可能有一点抽象,这里我就把上图红黑树示例中一个图为例子将它转化为2-3-4树:


RBTree_2-3-4Tree.png

(这里图拉长就很小了,所以放在两行展示清楚一点。这里面总共包含了三步转换)

好了到了这里红黑树和2-3-4树之间的联系已经很明显了吧。

总结一下:红黑树经过转换可以看作是一个2-3-4树,而这个转换的关键就是找到“红线”。从2-3-4树的角度看,2-3-4树因为有着节点“缓存”的能力因此可以在插入删除节点时保持树的平衡。而红黑树作为2-3-4树的另一种展现形式自然也拥有着插入删除节点时对树进行调整至平衡的方法。

上面花了大半篇幅介绍2-3-4树其实主要还是为了说明红黑树在添加删除操作时和2-3-4树之间的联系,剩下的红黑树的添加删除操作的理解我就放在后面一篇文章去分析了。

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

推荐阅读更多精彩内容

  • R-B Tree简介 R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找...
    张晨辉Allen阅读 9,076评论 5 30
  • 一. 算法之变,结构为宗 计算机在很多情况下被应用于检索数据,比如航空和铁路运输业的航班信息和列车时刻表的查询,都...
    Leesper阅读 6,699评论 13 42
  • 红黑树是平衡二叉查找树的一种。为了深入理解红黑树,我们需要从二叉查找树开始讲起。 BST 二叉查找树(Binary...
    kanehe阅读 1,366评论 0 8
  • 2-3-4 Tree(2-3-4树) 二叉查找树(Binary Search Tree,简称BST)是一棵二叉树,...
    六尺帐篷阅读 84,462评论 20 140
  • 0.目录 1.算法导论的红黑树本质上是2-3-4树 2.红黑树的结构和性质 3.红黑树的插入 4.红黑树的删除 5...
    王侦阅读 2,395评论 1 2