红黑二叉查找树

文章目录

之前所述的
2-3树 的插入算法并不难理解,我们要利用名为
红黑二叉查找树 的简单数据结构来表达并实现它。最后的代码量并不大。

一、定义

红黑树背后的思想是用标准的二叉查找树(完全由2-结点构成)和一些额外的信息(替换3-结点)来表示 2-3树

对于任意的2-3树,只要对结点进行转换,我们都可以立即派生出一颗对应的二叉查找树。我们将用这种方式表示2-3树的二叉查找树称为 红黑树

我们将树中的链接分为两种类型:
红链接 将两个2-结点连接起来构成一个3-结点
黑链接 则是2-3树中的普通链接。
确切地说,我们将 3-结点 表示为由一条 左斜 的红色链接相连的两个2-结点

《红黑二叉查找树》

红黑树的另一种定义是满足下列条件的二叉查找树:
⑴ 红链接均为左链接
⑵ 没有任何一个结点同时和两条红链接相连。
⑶ 该树是 完美黑色平衡 的,即任意空链接到根结点的路径上的黑链接数量相同。

如果我们将一颗红黑树中的红链接画平,那么所有的空链接到根结点的距离都将是相同的。如果我们将由红链接相连的结点合并,得到的就是一颗2-3树。
《红黑二叉查找树》

无论我们用何种方式去定义它们,红黑树都既是二叉查找树,也是2-3树。红黑树与2-3树在本质上是相同的,只是它们对3-结点的表示不同。

优点:
2-3树的深度很小,平衡性好,效率高,但是其有两种不同的结点,实际代码实现比较复杂。
而红黑树用红链接表示2-3树中另类的3-结点,统一了树中的结点类型,使代码实现简单化,无需修改就可以直接使用标准二叉查找树的get()方法,又不破坏其高效性。

因此,如果我们能够在保持一一对应关系的基础上实现2-3树的插入算法,那么我们就能够将两个算法的优点结合起来:二叉查找树简洁的查找方法 和 2-3树高效的平衡插入算法、

二、相关操作

2.1 颜色表示

每个结点都只会有一条指向自己的链接(从它的父结点指向它),我们将链接的颜色保存在表示结点的Node数据类型的布尔变量color中(若指向它的链接是红色的,那么该变量为true,黑色则为false)。

当我们提到一个结点颜色时,我们指的是指向该结点的链接的颜色

2.2 左旋转、右旋转

在我们实现的某些操作中可能会出现红色右链接或者两条连续的红链接,但在操作完成前这些情况都会被小心地旋转并修复。
旋转操作可以保证红黑树的两个重要性质:有序性完美平衡性

旋转操作会改变红链接的指向。 红色的右链接被转换为左链接,这个操作叫做左旋转
《红黑二叉查找树》

1) 向2-结点中插入新键
– 如果新键 < 老键,新增一个红色结点即可。新的红黑树与单个3-结点完全等价
– 如果新键 > 老键,新增的红色结点会产生一条红色右链接,需要使用右旋转修正
《红黑二叉查找树》 《红黑二叉查找树》

2) 向3-结点中插入新键
– 如果新键 < 树中的两个键:得到两条连续的红色左链接,将上层的红链接右旋转
– 如果新键 > 树中的两个键:将两条链接的颜色都由红变黑
– 如果新键介于树中的两个键之间:下层的红链接左旋转,即可得到第一种情况 (两条连续的红色左链接)
《红黑二叉查找树》

2.3 颜色转换

转换一个结点的两个红色子节点的颜色,同时将父节点的颜色由黑变红
《红黑二叉查找树》

2.4 总结

只要谨慎地使用左旋转右旋转颜色转换 这三种简单的操作,我们就能保证插入操作后红黑树和2-3树的一一对应关系。

在沿着插入点到根节点的路径向上移动时,在所经过的每个节点中完成以下操作:
– 如果右子节点是红色的,而左子节点是黑色的:进行左旋转
– 如果左子节点是红色的,且它的左子节点也是红色的(两条连续的红色左链接):进行右旋转
– 如果左右子节点均为红色:进行颜色转换

举例: 一棵红黑树的构造全过程
《红黑二叉查找树》

另一种红黑树插入操作的思考方式:
向红黑树中插入操作时,先将其转换成2-3树进行插入。然后再将2-3树的结果转换成等效的红黑树(将3-结点转化为红结点)即可。可参考史上最简单清晰的红黑树讲解

三、各种查找符号表的性能比较

所有基于红黑树的符号表实现都能保证操作的运行时间为对数级别。
《红黑二叉查找树》
《红黑二叉查找树》

《红黑二叉查找树》

    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/gaoruowen1/article/details/82750146
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞