美文网首页
结合2-3-4树理解红黑树(1) —— 概览

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

作者: Nier_if | 来源:发表于2018-04-24 20:04 被阅读109次

红黑树是一种相对平衡的二叉树,它可以在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树插入的具体逻辑。首先当定位到插入的节点时一个2node(节点中只有一个数据并且拥有两个子节点)时,插入的数据会被“并入到”2node节点当中,然后形成一个3node节点。如下图:


2-3-4Tree_Insert.png

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


2-3-4Tree_Insert2.png

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


2-3-4Tree_Insert3.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树之间的联系,剩下的红黑树的添加删除操作的理解我就放在后面一篇文章去分析了。

相关文章

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

    红黑树是一种相对平衡的二叉树,它可以在O(log n)时间内做出查找,和二分查找的效率低相似的。它的用途也非常的广...

  • 结合2-3-4树理解红黑树(2) —— 插入

    本篇主要写的是结合之前分析的2-3-4树和红黑树之间的联系分析红黑树的插入删除操作的原理。我刚刚开始学红黑树时在网...

  • 算法学习----2-3-4树原理演示

    目标 理解2-3-4树概念,并用图展示插入流程 概念和规则 2-3-4树和红黑树一样,也是平衡树。只不过不是二叉树...

  • 红黑树专题

    0.目录 1.算法导论的红黑树本质上是2-3-4树 2.红黑树的结构和性质 3.红黑树的插入 4.红黑树的删除 5...

  • 结合2-3-4树理解红黑树(3) —— 删除

    首先在分析红黑树删除操作之前先说明一下搜索二叉树中删除一个节点时的一个技巧。当删除节点位与树的内节点时,这个时候可...

  • 彻底理解红黑树(二)之 插入

    彻底理解红黑树(一)之 二叉搜索树彻底理解红黑树(二)之 插入彻底理解红黑树(三)之 删除 前言 红黑树的插入情况...

  • 彻底理解红黑树(三)之 删除

    彻底理解红黑树(一)之 二叉搜索树彻底理解红黑树(二)之 插入彻底理解红黑树(三)之 删除 前言 红黑树的删除情况...

  • 彻底理解红黑树(一)之二叉搜索树

    彻底理解红黑树(一)之二叉搜索树彻底理解红黑树(二)之插入彻底理解红黑树(三)之删除 1. 二叉搜索树的定义 二叉...

  • 树-2-3-4树->红黑树

    变换是局部的,只会影响到关联连接,且每次变换都是很小的常量 2-3-4树 http://www.cnblogs.c...

  • 红黑树

    一、定义 红黑树(Red Black Tree)是一种特殊的二叉查找树(有时也称为2-3-4树),相比二叉查找树,...

网友评论

      本文标题:结合2-3-4树理解红黑树(1) —— 概览

      本文链接:https://www.haomeiwen.com/subject/ucqdlftx.html