2-3树与红黑树

红黑树与2-3树具有等价性,我们在了解红黑树前先了解2-3树对我们理解红黑树是有帮助的,同时,对于理解B树也是有帮助的(用于磁盘存储,文件系统或数据库存储)

 

1.  2-3树

下面的图片就是一颗2-3树

可以看出,2-3树是一棵绝对平衡的树——根节点到任意一个叶子节点所经过的节点数量是相同的

那么2-3树是怎样来维护它的绝对平衡的呢?我们来看看下面例子

假设现在有个根节点42,现在要向42添加一个元素37,如果是二分搜索树,则37应该添加到42的左子节点,但是2-3树有一个很重要的性质:就是对于2-3树来说添加节点绝对不会添加到一个空的位置。

因为42的左子树为空,所以37只能添加到最后一个叶子节点上,而现在最后一个叶子节点是根节点42,所以37与42融合,成为一个3-节点,此时只有一个节点,整个树是绝对平衡的。

现在我们又添加一个12,但此时根节点的左子树还是为空,为了保持绝对平衡,12先与根节点融合成为4-节点

但由于2-3树不能存在4-节点,所以此时的根节点可以分裂成一棵子树,有三个2-节点组成的绝对平衡树

这里我们总结下:2-3树中添加一个新的元素,它不会像二分搜索树一样添加到一个空的节点位置,它一定会添加到我们最后搜索到的叶子节点,和它进行融合。

1)如果我们要融合的节点是个2-节点的话,我们就直接融合成一个3-节点

2)如果我们融合的节点本来就是一个3-节点的话,我们就临时融合成一个4-节点,然后这个4-节点我们再将它变形,变形成一个子树,如果我们融合的这个3-节点本身就是根节点,那很好办

如果我们融合的3-节点是叶子节点,父亲节点为2-节点的话

如果我们融合的3-节点是叶子节点,父亲节点为3-节点的话

 

2. 红黑树与2-3树的等价性

对于红黑树,它只能存在一个元素,所以2-3树中2-节点和3-节点在红黑树中对应的关系

所有红色节点都是左倾斜的是人为定义的

我们了解了2-3树和红黑树之间的关系我们可以看下红黑树的相对于BST树的基础代码有哪些变化

最后,我们来看下红黑树的5个性质:

我们来一一看下这五条性质:

1)这条就不用讲了:)

2)红黑树本身等价于2-3树,而红黑树中的根节点要不是2-节点,要不就是3-节点,我们看下面这这张图2-3树中2-节点和3-节点的等价图:

3)第三条我们要看清楚是指的最后的空节点,这条与其说是性质,不如说是定义,我们再红黑树定义空为黑色

4)我们还是可以更据2-3树中2-节点和3-节点的等价图来看

红色节点下面有两个节点,如果子节点是2-节点的话,那肯定就是黑色,如果是3-节点,那首先连接的也是黑色,然后黑色的左节点才是红色(而对于黑色节点,它的右孩子肯定是黑色,左孩子就不一定了)

5)这条是核心,我们看下下面的图就一清二楚了

由于红黑树的最大高度为2logn,它会比AVL树的高度高,所以我们再红黑树上对元素的寻找会比AVL慢一点,虽然都是O(logn)级别,但是为什么红黑树这么重要,因为对于红黑树来说,添加与删除元素这两个操作相比于AVL来说更快一些,如果我们存储的数据结构要经常发生添加和删除的变动的话,相应的使用红黑树会更好些。而数据不怎么变动,查询更多的话,AVL还是快一点点。

3. 红黑树添加元素的子方法

我们先看下在2-3树中添加一个新的元素:

  1. 添加进2-节点,形成一个3-节点
  2. 添加进3-节点,形成一个4-节点

所以可以看到,红黑树添加节点时,永远添加红色节点,后续再根据树的平衡情况做相应的调整

3.1  向2-节点添加元素

1) 根节点应变为黑色

2) 左旋转

现在有棵红黑树的根节点是42,现在向树中添加一个比42小的元素37,则直接添加即可(加入节点初始都是红色)

现在,我们假定红黑树还是只有一个根节点37,现在向树中添加一个比37大的元素42

而我们定义我们的红黑树中的红色节点都是向左旋转的,所以我们此时要进行左旋转

旋转完成后我们再对两个节点的颜色做个调换

在这里,可能大家会有疑问,x.color=node.color,如果node不是根节点的情况下,node可能是红色,那node和x节点都是红色了啊,大家不用急,这个左旋转只是一个子过程,在左旋转之后,有可能产生两个连续的红色节点,然后我们会将左旋转后产生的新的根x传回去,在传回去之后,在我们添加逻辑中,还要进行更多的后续处理,而这些后续处理将在后面讲到。

左旋转的过程中并不维持红黑树的性质,我们左旋转操作的目的是为了使42和37这两个元素对应成2-3树中的一个3-节点就可以了,接下来看下代码:

3.2 向3-节点添加元素

 

1)颜色翻转(flipColors)

因为66比42大,所以66就成为42的右子节点

上面这个二叉树其实相当于2-3树中的4-节点,如下如

而且42这个节点还要继续向上做融合才能保持绝对平衡,所以红黑树中就要相应的做颜色的变换,如下

接下来我们看下代码:

 

2)右旋转

向3-节点中添加元素12

这样的情况在2-3树中相当于:

所以我们需要对上面的红黑树进行右旋转

接下来,x要与原先根节点node的颜色相同,并且现在node节点是与现在的根节点x融合的(现在这个结构还是4-节点),所以现在node应该是红色

好,现在我们就可以用到上面讲的颜色翻转就行了

我们来看下代码:

 

3)第三种情况

我们用之前使用的三个过程就可已完成了

 

 

 

4.  添加

首先我们对上一节对3-节点中添加元素做个总结,如下图:

最后我们看下代码

猜你喜欢

转载自blog.csdn.net/qq_36582604/article/details/81698927
今日推荐