2_3查找树

来源:互联网 发布:win7桌面整理软件 编辑:程序博客网 时间:2024/06/05 06:05

2_3查找树的定义

在一棵含有N个结点的二叉查找树中,我们希望树高为lgN,这样就能保证所有查找都能在lgN次比较内结束,就和二分查找一样。

2_3查找树可以解决这样的问题:

定义:

一棵2-3查找树或为一棵空树,或由以下结点组成:

2-结点,含有一个键和两条链接,左链接指向的2-3树种的键都小于该结点,右链接指向的2-3树中的键都大于该结点。

3-结点,含有两个键和三条链接,左链接指向的2-3树种的键都小于该结点,中链接指向的2-3树种的键都位于该结点的两个键之间,右链接指向的2-3树中的键都大于该结点。

一棵完美平衡的2-3查找树中的所有空连接到根节点的距离都应该是相同的。

2-3查找树的重点是插入和删除过程中如何保持平衡,查找过程和普通二叉查找树无异。

2-3查找树的查找

这里写图片描述

2-3查找树的插入

2-3查找树的插入是一个复杂的过程,插入要保证在插入一个新元素之后查找树的平衡性不变。

为了更好地理解2-3查找树的插入,我们分成四种情况进行讨论:

(1).向2-结点中插入新键

要向2-3查找树插入一个新结点,我们需要将要插入结点在2-3查找树中进行一次未命中查找,如果未命中查找结束于一个2-结点,那么事情就好办了,我们只需要向这个2-结点中加入要插入键,将2-结点拓展为3-结点即可。

这里写图片描述

(2).向一棵只含有一个3-结点的树种插入新键

我们先假设需要向一棵只含有一个3-结点的树中插入一个新键,这个3-树就像这样
这里写图片描述
向这课树插入结点,我们只需要先拓展3-结点,使之成为4-结点,拓展之后的结果如下:
这里写图片描述
然后,将这个结点分裂,转换为一棵由3个2-结点组成的2-3树,其中一个结点(根)含有中键,一个结点含有3个键中最大者(和根结点的右链接相连),一个结点含有3个键中的最小者(和根结点的左链接相连)。转换完成之后这棵树就变成一棵含有3个结点的二叉查找树,同时也是一棵完美平衡的2-3树。
这里写图片描述

(3).向一个父结点为2-结点的3-结点中插入新键

假设我们未命中查找结束于一棵3-结点,并且这个3-结点的父结点为2-结点,这个时候我们可以先参照(2)中的将3-结点拓展为4-结点,然后再将其分裂,不过此时我们不会为中键创建一个新结点,而是将其移动至原来的父结点中,因为此时父结点为2-结点,将中键移入父结点中使父结点成为3-结点,就可以继续保持平衡。转换过程如图所示:

这里写图片描述

(4).向一个父结点为3-结点的3-结点中管插入新键

假设未命中查找结束于一个父结点为3-结点的3-结点。我们也是和(3)一样,构造一个4-结点并分解它,然后将中键插入到它的父结点中,但此时父结点也是一个3-结点,因此我们再次使用这个中键和父结点构造一个4-结点,分解4-结点然后将中键插入到更高层父结点中,若此时跟高层的父结点还是3-结点,我们就必须继续上溯重复执行这个过程直到遇到一个2-的结点并将它替换为一个不需要继续分解的3-结点。
还有一种情况就是我们在上溯的时候,直到上溯到根结点时还没有找到一个2-结点,即当我们上溯到根结点时,到达了3-结点的根,这个时候,我们就需要分解根结点了,如果从插入结点到根结点的路径上全都是3-结点,那我们的根结点最终会编程一个临时的4-结点。此时我们可以按照向一棵只有一个3-结点的书中插入新键的方法处理这个问题,我们将临时的结点分解称为3个2-结点,使得树高加1。这次最后的变换仍然保持了树的完美平衡性,因为它变换的是根结点。

这里写图片描述

值得注意的是,2-3查找树不管是局部变换还是全局变换都不会影响数的全局有序性和平衡性。
原创粉丝点击