2-3-4树和红黑树(下)

红黑树

红黑树的定义

红黑树是一种与2-3-4树完全等价的二分查找树。2-3-4树由于节点中的键的个数的不确定性增加了实现的复杂度和性能。为了克服2-3-4树的这种缺点,同时利用二分查找树的简单性,红黑树应运而生。红黑树具有以下特点:

  1. 每个节点要么是红色,要么是黑色
  2. 根节点是黑色的
  3. 每个叶子结点都带有两个空的黑色结点(称之为NIL节点,它又被称为黑哨兵)。
  4. 每个红色节点的两个子节点都是黑色(或者说从每个叶子到根的所有路径上不能有两个连续的红色节点)。
  5. 从任一节点到它所能到达NIL节点的所有简单路径都包含相同数目的黑色节点。

这些性质保证了根节点到任意叶子节点的简单路径长度,最多相差一半(因为路径上的黑色节点的个数相等,差别只是不能相邻的红色节点的个数),所以红黑树是一个基本平衡的二叉搜索树,它没有AVL树那么绝对平衡,但是同样的关键字组成的红黑树相比AVL旋转操作要少,而且删除操作也比AVL树效率更高,实际应用效果也比AVL树更出众。当然红黑树的具体实现也复杂的多。

示例如下:
红黑树示例

红黑树和2-3-4树的等价关系

红黑树的节点和2-3-4树节点的对应关系如下:
2-3-4树节点和红黑树节点的对应关系

把红黑树的红色节点合到它的父节点以后就形成了2-3-4树的3-节点或4-节点,红黑树也就变成了2-3-4树。所以红黑树的操作和2-3-4树的操作一一对应。同时从2-3-4树的角度也能更好的理解红黑树的性质,例如:2-3-4树从根节点到叶子节点的路径的长度相等,对应着红黑树性质3中根-叶子路径中黑色节点的个数相等。

同时,由于2-3-4树的3-节点有两种不同的红黑树形态,分别为左倾(红节点在左边)和右倾(红节点在右边),所以一颗2-3-4树有多种红黑树的表示,但是一颗红黑树只能表示一颗2-3-4树。如下所示:
在这里插入图片描述

红黑树的旋转( rotation)

左旋

左旋的过程是以x节点为中心将x的右子树绕x逆时针旋转,使得x的右子树成为x的父亲,同时修改相关节点的引用。旋转之后,二叉查找树的属性仍然满足。如下所示:
在这里插入图片描述

右旋

右旋的过程是以x节点为中心将x的左子树绕x顺时针旋转,使得x的左子树成为x的父亲,同时修改相关节点的引用。旋转之后,二叉查找树的属性仍然满足。
在这里插入图片描述

红黑树的插入操作

红黑树的插入可以对比着二分查找树的插入和2-3-4树的插入进行理解。

  1. 红黑树按照二分查找树的插入方法查找待插入的位置,待插入的位置一定在叶子节点
  2. 将新的节点追加到叶子节点成为叶子节点的子节点,然后将该节点涂红
  3. 调整红黑树的结构和节点的颜色,以维护红黑树的性质

这三步插入操作跟2-3-4树的自底而上的插入操作一一对应,我们假设节点 X是新加入的节点或者回溯时由下层晋升而来的节点(2-3-4树中往4-节点插入节点后会向上晋升一个节点)

  • 黑父
    红黑树插入-黑父
    无需做任何调整(如果x是由底层晋升的,调整到此结束)。
    绿色箭头表示插入位置,虚线表示节点可有可无,绿色节点表示节点颜色不确定。对称的场景,即在右子支插入,处理的方式相同,不再赘述
    此种情况对应2-3-4树中的向2-节点或3-节点插入
  • 红父黑叔
    在这里插入图片描述
    这种情况还有对应的镜像情况,即P为G的右子支的情况
    在这里插入图片描述
    此种情况下P不能是叶子节点(P为叶子节点的话,U必须是叶子节点,则根节点到P和U的路径上黑色节点的个数不同),即X是插入回溯的节点。
    此种情况对应着2-3-4树的3节点插入,在2-3-4树中无需调整结构,但是由于插入后的4-节点跟红黑树的4-节点结构不符,所以需要调整
  • 红父红叔
    在这里插入图片描述
    此种情况对应着2-3-4树的4-节点插入,2-3-4树的4-节点插入需要拆分为3个2节点,并晋升其中的父节点,对应着父、叔由红变黑,然后父节点的父节点变红

红黑树的删除操作

红黑树的删除操作的前置步骤跟二分查找树的删除操作一致,只不过加入了删除后的调整操作,用来维护红黑树的性质。具体步骤如下:

  • 查找待删除键所在的节点,若不存在,则删除失败,否则转入下一步执行
  • 根据当前节点的左右子树,做不同的处理
    • 如果当前节点的左右子树都是空,则直接删除该节点
    • 如果当前节点的左右子树有一颗为空,则用非空子树代替该节点
    • 如果当前节点的左右子树都不为空,则查找当前节点的后继节点,交换当前节点和后继节点的数据(不交换颜色),此时待删除节点在原先后继节点的位置且后继节点必然最多有一颗子树,按照上述的场景继续进行处理
  • 根据不同的删除情况,进行颜色变换或调整结构,策略基本与2-3-4树相同
删除后的颜色变换和调整

注意,实际删除的节点,必然最多有一颗子树

删除红节点

在这里插入图片描述
删除红节点,并不影响红黑树的性质,无需调整。
此种情况对应着删除2-3-4树中底部的3-节点对应红黑树的红色子节点,以及4-节点的对应的红黑树的两个红节点的一个(底部4-节点的黑节点不会被直接删除)

删除黑节点,且该黑节点只有一颗子树,则这颗子树必然只含有一个红节点

在这里插入图片描述
此种情况下,只需S替换删除的X后,变为黑色,无需继续调整。
此种情况对应着删除2-3-4树底部3-节点的黑色根节点

删除黑色节点,且该黑色节点没有子树(叶子节点)

此中情况,对应着删除2-3-4树底部的2-节点,需要做结构调整。在图中X总表示下一层的节点,一开始X表示NIL节点(回溯过程中X会不断向上层迭代)。需要调整的情况又可以分为以下几种。

黑兄红侄

在这里插入图片描述
此种情况对应着2-3-4树删除底部2-节点后调整过程中的兄弟节点是3-节点或4-节点的情况。

  • 兄弟节点是3-节点对应着上图中第一幅图的R节点为黑色和第二副图,这种情况下以P节点为中心的右旋操作,代表着2-3-4树中兄弟3-节点中靠近X节点的键上移到父节点,对应的父节点中的键下移
  • 兄弟节点是4-节点对应着上图中第一幅图的R节点为红色,这种情况根2-3-4树的场景略有不同。2-3-4树正常的处理策略应该是R节点上移到父节点,因为R节点是兄弟3-节点中最靠近X节点的,如下所示:
    在这里插入图片描述
    但是在红黑树中如果要把R节点上移到父节点,需要进行两次旋转:先以B节点为中心左倾,再以P节点右倾,为了减少调整成本,直接以P节点为中心右倾,相当与2-3-4树中的调整操作进行了两次,仍然可以保持2-3-4树的性质,如下所示:
    在这里插入图片描述

这种情况还有对应的镜像情况,即P为G的右子支情况
在这里插入图片描述

黑兄黑侄红父

在这里插入图片描述
此种情况对应2-3-4树删除底部2节点回溯过程中的毗邻的兄弟节点是2-节点,父节点是3-节点或者4-节点的情况,父节点下移和兄弟节点合并

黑兄黑侄黑父

在这里插入图片描述
此种情况对应2-3-4树删除底部2-节点回溯过程中父节点和兄弟节点都是2-节点,对应的操作是合并父节点和兄弟节点,继续回溯

红兄黑侄黑父

在这里插入图片描述
按照2-3-4删除操作的原理,我们这里应该检测黑侄R(第二幅图中是L)的两个孩子节点是否存在红色节点(对应2-3-4树,是否是2节点),但这样做使用的局部变量也会增多,代码实现起来也会变得非常复杂。我们这里做了一个技巧性处理,以P为轴进行旋转,它原理就是第2部分2-3-4树和红黑树的等价关系中讲到的:一颗2-3-4对应的红黑树形态并不唯一。
上面的两种红兄情况,旋转后对应的还是同一颗2-3-4树(只是B和P组成的3节点在红黑树的两种不同形态而已),但此时X的兄弟节点和侄子节点发生变化,现在X的兄弟节点就变成了R(第二幅图中是L),我们正需检查要R(第二幅图中是L)的两个孩子节点的颜色。实际上,此时我们又回到上面讨论过的了黑兄的情况。

参考

从2-3-4树到红黑树

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值