数据结构之2-3-4树

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

1. 2-3-4树是什么

在二叉树中,每个节点有一个数据项,最多有两个子节点。如果允许每个节点可以有更多的数据项和更多的子节点,就是多叉树(multiway tree)。
2-3-4树就是一种阶为4的多叉树,它像红黑树一样是平衡树,可以保证在O(lgn)的时间内完成查找、插入和删除操作,容易实现,但是效率比红黑树稍差。
下图展示了一颗2-3-4树:
在这里插入图片描述

它有如下特点:

  • 每个节点可以保存一个、两个或者三个数据项。
  • 底层的六个节点都是叶节点,所有的叶节点都是在一层上的。
  • 非叶子节点的子节点总数总是比它含有的数据项大1

2-3-4树中的2、3、4的含义指的是一个节点可能含有的子节点数。对非子叶节点有三种可能的情况:

  • 有一个数据项的节点总是有两个子节点
  • 有两个数据项的节点总是有三个子节点
  • 有三个数据项的节点重是有四个子节点

上述的重要的关系决定了2-3-4树的结构,比较而言,叶节点没有子节点,然而它可能还有一个、两个、三个数据项,而空节点是不会存在的。在2-3-4树中不允许只有一个链接。有一个数据项的节点必须总是保持两个连接,除非它是叶节点,在那种情况下没有连接。
如下图所示,有两个链接的节点被称为2-节点,有三个链接的节点被称为3-节点,有四个链接的节点被称为4-节点,
在这里插入图片描述
树结构中很重要的一点就是它的链接与自己数据项的关键字之间的关系。二叉树中,所有关键字比某个节点值小的节点都在左子树中,所有关键字比某个值大的节点都在右子树,2-3-4树的规则与之类似:
在这里插入图片描述

2. 查找

查找特定的关键字值的数据项和在二叉树中的搜索例程很类似。从根开始,除非要查找的关键字值就是根,否则选择关键字值所在的合适范围,转向那个方向,直到找到为止。

在这里插入图片描述
以上图为例查找64。首先从根节点开始,根节点只有一个数据项50,没有找到,而且因为64比50大,那么转到根节点的右子树。60|70|80 中也没有找到,但是60<64<70,所以转到该节点的第二个子节点:62|64|66,发现其第二个数据项正好是64。

3. 插入

  1. 如果2-3-4树中已存在当前插入的key,则插入失败,否则最终一定是在叶子节点中进行插入操作
  2. 如果待插入的节点不是4-节点,那么直接在该节点插入
  3. 如果待插入的节点是个4-节点,那么应该先分裂该节点然后再插入。一个4-节点可以分裂成一个根节点和两个子节点(这三个节点各含一个key)然后在子节点中插入,我们把分裂形成的根节点中的key看成向上层插入的key,然后重复第2步和第3步。

如果是在4-节点中进行插入,每次插入会多出一个分支,如果插入操作导致根节点分裂,则2-3-4树会生长一层。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. 带预分裂的插入

上面的插入操作在某些情况需要不断回溯来调整树的结构以达到平衡。为了消除回溯过程,在插入操作过程中我们可以采取预分裂的操作,即我们在插入的搜索路径中,遇到4-节点就分裂(分裂后形成的根节点的key要上移,与父节点中的key合并)这样可以保证找到需要插入节点时可以直接插入(即该节点一定不是4节点)。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5. 删除

  1. 如果2-3-4树中不存在当前需要删除的key,则删除失败。
  2. 如果当前需要删除的key不位于叶子节点上,则用后继key覆盖,然后在它后继key所在的子支中删除该后继key。
  3. 如果当前需要删除的key位于叶子节点上:
    3.1 该节点不是2-节点,删除key,结束
    3.2 该节点是2-节点,删除该节点:
    3.2.1 如果兄弟节点不是2-节点,则父节点中的key下移到该节点,兄弟节点中的一个key上移
    3.2.2 如果兄弟节点是2-节点,父节点是个3-节点或4-节点,父节点中的key与兄弟节点合并
    3.2.3 如果兄弟节点是2-节点,父节点是个2-节点,父节点中的key与兄弟节点中的key合并,形成一个3-节点,把此节点看成当前节点(此节点实际上是下一层的节点),重复步骤3.2.1到3.2.3

如果是在2节点(叶子节点)中进行删除,每次删除会减少一个分支,如果删除操作导致根节点参与合并,则2-3-4树会降低一层。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6. 带有预合并的删除

在删除过程中,我们同样可以采取预合并的操作,即我们在删除的搜索路径中(除根节点,因为根节点没有兄弟节点和父节点),遇到当前节点是2节点,如果兄弟节点也是2节点就合并(该节点的父节点中的key下移,与自身和兄弟节点合并);如果兄弟节点不是2节点,则父节点的key下移,兄弟节点中的key上移。这样可以保证,找到需要删除的key所在的节点时可以直接删除(即要删除的key所在的节点一定不是2节点)。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u012152619/article/details/84332165