2-3 查找树

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gaoruowen1/article/details/82734569


在之前的二分搜索和二叉查找树中已经能够很好地解决查找的问题了,但是它们在最坏情况下的性能还是很糟糕
理想情况下我们希望能够保持二分查找树的 平衡性。在一棵含有N个结点的树中,我们希望树高为 ~lgN,这样我们就能保证所有查找都能在 ~lgN 次比较内结束

一、定义

为了保证查找树的平衡性,我们需要一些灵活性,因此我们允许树中的一个结点保存多个键。
将一棵标准的二叉查找树中的结点称为 2-结点,它含有一个键和两条链接
引入 3-结点,它含有两个键和三条链接。

一棵2-3查找树或为一棵空树,或由一下结点组成:
2-结点,含有一个键(及其对应的值)和两条链接,左链接指向的键都小于该结点,右链接指向的键都大于该结点。
3-结点,含有两个键(及其对应的值)和三条链接,左链接指向的键都小于该结点,中链接指向的键都位于该结点的两个键之间,右链接指向的键都大于该结点。

这里写图片描述
一棵完美平衡的2-3查找树中,所有空链接到根节点的距离都是相同的。

二、相关操作

2.1 查找

2-3树的查找算法与二叉查找树相似。
这里写图片描述

2.2 插入

1、向2-结点中插入新键:
– 把这个2-结点替换成一个3-结点,将要插入的键保存在其中
这里写图片描述

2、向一棵只含有一个3-结点的树中插入新键:
– 临时将新建存入该结点,使之成为一个4-结点
– 将临时的4-结点转换成3个2-结点,树高加一
这里写图片描述

3、向一个父节点为2-结点的3-结点中插入新键:
– 临时将新建存入该结点,使之成为一个4-结点
– 将 中键 插入到它的父节点中,父节点变成了一个3-结点
这里写图片描述

4、向一个父节点为3-结点的3-结点中插入新键:
– 临时将新建存入该结点,使之成为一个4-结点
– 将 中键 插入到它的父节点中,父节点也变成了一个4-结点,就这样一直向上不断分解临时的4-结点并将中键插入更高层的父节点,直至遇到一个2-结点并将它替换为一个不需要继续分解的3-结点。
这里写图片描述

5、分解根节点
如果从插入结点到根节点的路径上全都是 3-结点,我们的根节点最终变成一个临时的4-结点
可以按照向一棵只有一个 3-结点 的树中插入新键的方法处理。将临时的4-结点转换成3个2-结点,树高加一
这里写图片描述

扫描二维码关注公众号,回复: 3469354 查看本文章

三、性能分析

这里写图片描述
因此,我们可以确定2-3树在最坏情况下仍有较好的性能。
但是,和真正的实现还有一段距离。尽管可以用不同的数据类型表示 2-结点 和 3-结点,但代码量大,而且它们所产生的额外开销可能会使算法比标准的二叉查找树更慢。

幸运的是你将看到,只需要一点点代价就能用一种统一的方式完成所有变换,即红黑二叉查找树。



猜你喜欢

转载自blog.csdn.net/gaoruowen1/article/details/82734569
今日推荐