数据结构与算法之2-3树

我们在上篇二叉查找树中曾介绍过二叉查找树有可能会出现其中一个极端情况,所有的结点变成了一条链。如图
数据结构与算法之2-3树_第1张图片
我们当然希望我们能保存二叉查找树的平衡性,但是在动态插入过程中保证树的完美平衡代价太大了。我们退而求其次,学习一种新的数据结构。

定义

2-3查找树是一种平衡树的思想,我们可以将标准二叉查找树的结点称为2-结点(含有一个键和两条链),而现在我们引入3-结点,它含有两个键和三条链,每一条链就是一个分区。一棵2-3查找树要么为空,要么满足满足下面两个要求:

A、2-结点:含有一个键(及对应值)和两条链接,左链接指向2-3树中的键都小于该结点,右链接指向2-3树中的键都大于该结点。
B、3-结点:含有两个键(及对应的值)和三条链接,左链接指向2-3树中的键都小于该结点,中链接指向的2-3树中的键都位于该结点的两个键之间,右链接指向2-3树中的键都大于该结点。
如下图所示:
数据结构与算法之2-3树_第2张图片
一颗完美的2-3查找树中所有的空链接到根结点的距离都是相等的。

查找

在进行2-3树的平衡之前,我们先假设已经处于平衡状态,我们先看基本的查找操作。

2-3树的查找和二叉查找树类似,要确定一个树是否属于2-3树,首先我们将一个键与根结点中的键比较,如果他和其中任意一个相等,则命中;否则就根据比较的结果找到指向相应区域的链接,并在其指向的子树中继续查找。如果是空链接,则查找未命中。查找过程如下图,如果第2步中,没有中线,则表示未查询到36。
数据结构与算法之2-3树_第3张图片

插入

往2-节点插入

往2-3树中插入元素和往二叉查找树中插入元素一样,首先要进行查找,然后将节点挂到未找到的节点上。2-3树之所以能够保证在最差的情况下的效率的原因在于其插入之后仍然能够保持平衡状态。如果查找节点是一个2-节点,那么很容易,我们只需要将新的元素放到这个2-节点里面使其变成一个3-节点即可,如下图所示。
数据结构与算法之2-3树_第4张图片

往3-节点插入

只包含一个3-节点

往一个3-节点插入一个新的节点可能会遇到很多种不同的情况,下面首先从一个最简单的只包含一个3-节点的树开始讨论,如下图:
数据结构与算法之2-3树_第5张图片

假设2-3树只包含一个3-节点,这个节点有两个key,没有空间来插入第三个key了,最自然的方式是我们假设这个节点能存放三个元素,暂时使其变成一个4-节点,同时他包含四个子节点。然后,我们将这个4-节点的中间元素提升,左边的节点作为其左节点,右边的元素作为其右节点。插入完成,变为平衡2-3查找树,树的高度从0变为1。

当前是3-节点,父节点是2-节点

和第一种情况一样,我们也可以将新的元素插入到3-节点中,使其成为一个临时的4-节点,然后,将该节点中的中间元素提升到父节点即2-节点中,使其父节点成为一个3-节点,然后将左右节点分别挂在这个3-节点的恰当位置。操作如下图:
数据结构与算法之2-3树_第6张图片

当前是3-节点,父节点是3-节点

当我们插入的节点是3-的时候,我们将该节点拆分,中间元素提升至父节点,但是此时父节点是一个3-节点,插入之后,父节点变成了4-节点,然后继续将中间元素提升至其父节点,直至遇到一个父节点是2-节点,然后将其变为3-节点,不需要继续进行拆分。
数据结构与算法之2-3树_第7张图片

当根节点为3-节点,根节点分裂

当根节点是3-节点的时候,如果这时我们要在字节点插入新的元素的时候,会一直拆分到跟节点,在最后一步的时候,跟节点变成了一个4-节点,这个时候,就需要将跟节点查分为两个2-节点,树的高度加1,如下图所示
数据结构与算法之2-3树_第8张图片

性质区别

  • 2-3查找树是平衡树,从任意一个空连接到根结点的路径长度是相等的;
  • 4-结点变成两个2-结点时树的高度不会发生变化,只有当跟根结点时临时4-结点分裂成2个2-结点时树高才+1,这就极大的降低了树的高度,优化了查找;
  • 与普通的二叉查找树相比最大的区别是,2-3树是从下往上构造的
    数据结构与算法之2-3树_第9张图片

效率

2-3树的查找效率与树的高度是息息相关的。

  • 在最坏的情况下,也就是所有的节点都是2-节点,查找效率为lgN
  • 在最好的情况下,所有的节点都是3-node节点,查找效率为log3N约等于0.631lgN

对于1百万个节点的2-3树,树的高度为12-20之间,对于10亿个节点的2-3树,树的高度为18-30之间。

对于插入来说,只需要常数次操作即可完成,因为他只需要修改与该节点关联的节点即可,不需要检查其他节点,所以效率和查找类似。

在某些情况插入后的平衡操作可能会使得效率降低。在2-3查找树基础上改进的红黑树不仅具有较高的效率。但是2-3查找树作为一种比较重要的概念和思路对于后文要讲到的红黑树和B树非常重要,下一篇将分析红黑树。

你可能感兴趣的:(算法(JAVA),算法,数据结构,树)