2-3查找树
定义:
一颗2-3查找树要么是一颗空树,要么满足以下性质
1、2-结点,含有一个键和两条链接,左链接指向的键都小于该结点,右链接指向的键都大于该结点;
2、3-结点,含有两个键和三条链接,左链接指向的键都小于该结点,中链接指向的键都位于该结点的两个键之间,右链接指向的键都大于该结点。
插入:
1、 向2-结点中插入新键
2、 向一颗只含有一个3-结点的树中插入新键
3、 向一个父结点为2-结点的3-结点中插入新键
4、 向一个父结点为3-结点的3-结点中插入新键
5、 分解根结点
将一个4-结点分解为一棵2-3树可能有6种情况
1、根结点
2、父结点是2-结点
3、父结点是3-结点
通过以上示例的分析,我们对2-3树的变化方式有了一个认识,接下来,我们使用红黑二叉查找树这种数据结构来表示2-3树并实现相关操作。
红黑二叉查找树
在红黑树中,我们用红链接将两个2-结点连接起来构成一个3-结点,黑链接是2-3树中的普通链接。
有关红黑树的性质:
1、红链接均为左链接
2、没有任何一个结点同时和两条红链接相连
3、该树是完美黑色平衡的,即任意空链接到根结点的路径上的黑链接数量相同。
以上为性质,所以当我们在对红黑树进行操作的过程中可能出现红色右链接或者两条连续的红链接,在这种情况下,我们就需要对该树进行旋转以满足红黑树的性质。
1、左旋转h的右链接
2、右旋转h的左链接(同理)
3、向单个2-结点中插入新键
4、向树底部的2-结点插入新键
5、向一棵双键树(即一个3-结点)中插入新键
在了解各种旋转的情况之后,再来了解一个旋转的应用,那就是向树底部的3-结点插入一个新键。相信通过这个例子能够非常清晰地了解红黑树的旋转。
为保证插入操作后红黑树和2-3树的一一对应关系,我们需要保持以下规则:
1、如果右子结点是红色的而左子结点是黑色的,进行左旋转。
2、如果左子结点是红色的且它的左子结点也是红色的,进行右旋转。
3、如果左右子结点均为红色,进行颜色转换。
代码:
1 | public class RedBlackBST<Key extends Comparable<Key>, Value> { |
这其中的StdOut以及StdIn库使用自algs4这个jar包,下载地址:
https://algs4.cs.princeton.edu/code/algs4.jar
分析:
在对红黑树进行分析之前重新再次强调下红黑树的性质:
1、结点或者是黑色,或者是红色。
2、根结点是黑色。
3、每个叶子结点(NIL)是黑色。
4、如果一个结点是红色的,则它的子结点必须是黑色的。
5、从一个结点到该结点的子孙结点的所有路径上包含相同数目的黑结点。
主要需要分析的地方是红黑树的删除问题,关于这个问题,我们开始可以将红黑树直接当作2-3树完成删除操作,然后再去按照红黑树的要求将可能不符合要求的树“红黑化”。