多路查找树——2-3树和2-3-4树

版权声明:欢迎交流,本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_42513339/article/details/89016963

目录

2-3树定义

2-3树的插入

2-3树的删除

PS

2-3-4树定义

2-3-4树插入

2-3-4树删除

PS


2-3树定义

定义:多路查找树,其中每一个结点都具有两个孩子(称为2结点)或三个孩子(称为3结点。所有叶节点都在树结构的同一层,因此树的高度总是平衡的。

一个2结点包含一个元素和2个孩子(或者没有孩子),且与搜索二叉树类似,左子树包含的元素小于该元素,右子树包含元素大于该元素。不过与搜索二叉树不同的是,2结点要么没有孩子,要有就有两个,不能只有一个孩子。

2结点如下图所示(注:这里左右子结点可能是2结点或者3结点)

一个3结点包含一小一大两个元素,和三个孩子(或者没有孩子),要么没有孩子结点,要么有3个孩子。如果有三个孩子,左子树包含小于较小元素的元素,右子树包含大于较大元素的元素,中间子树包含介于两元素之间的元素。

3结点如下图(注:这里左右子结点可能是2结点或者3结点)

2-3树的插入

插入分三种情况:

1)对于空树,插入一个2结点即可,跟之前的一样。

2)插入结点到一个2结点的叶子上。由于其本身就只有一个元素,所以只需要将其升级为3结点即可。

如下图所示:含有元素3的结点插入,比8小,比4小,比1大,但是含有1元素的结点本身只有一个元素且没有子结点,所以把1元素所在位置的结点变成3结点。然后看插入元素比原来元素大小比较,这里顺序是1,3

3)网3结点插入一个新元素时,由于3结点本身已经是2-3树的结点最大容量(已经含有两个元素),因此需要拆分,将树中的两元素或插入元素的三者中选择其一向上移动一层。

如下图所示:

第一种情况:

  1. 含有元素5的结点插入,比8小,比4大,遇到3结点,无法再加。
  2. 此时发现父结点4是个2结点,因此可以考虑升级成3结点,但是3结点必须有是三个孩子,于是可以将6,7拆开,让6放入4中,成为3结点,将5成为中间孩子,7成为右孩子。(这里是判断大小选择变成3结点,和拆成2结点的数)

第二种情况:

  1. 含有元素11的结点 插入,比8大,但是比12小,12这里是三结点,之后又是比10大,这里12、14和9、10都是3结点,都无法插入。
  2. 既然9、10和12、14都不行,那么我们就继续看父结点,发现8是2结点,所以我们需要把9、10和12、14拆分,并满足3结点和2结点的规则。

例子:(可看出树的高度也发生了变化)

2-3树的删除

删除也分三种情况,与插入相反。

1)删除元素位于一个3结点,并且是叶子结点,无孩子结点,则可以直接删除一个元素变成2结点。

例子如下:

2)所删除的元素位于一个2结点上,即要删除的是一个只有一个元素的结点。如果直接删除肯定会造成父结点的孩子结点少一个,所以需要分情形来处理。分成四种情形。

  1. 情形一,此结点的父结点也是2结点,且拥有一个3结点的右孩子。如下图,删除结点1时,需要左旋,6改成父结点,4成为6的左结点,7是6的右结点。
  2. 情形二,此结点的父结点是2结点,它的右孩子也是2结点,如下图,要删除4结点,如果直接左旋的话,仍会没有右孩子,所以需要对整棵树进行变形,。
    由于2结点无法左旋,所以我们需要制造和情形一相同的情况,即7这个结点改成3结点,那就需要让比7稍大的元素下来,即8下来和7组成3结点,然后8这个位置需要比8稍大的元素进行补充,这里9放入(若遇到3结点那么跟情形一的处理方法一样)。最后7、8的3结点进行左旋即可。
  3. 情形三,此结点的父结点是3结点,如下图所示,删除结点10,那么父结点12、14就会少一个左结点,无法直接删。所以思路就是让父结点变成2结点,这样满足两个子节点的规则,然后把多于的元素和中间结点结合变成3结点。
  4. 情形四,如果当前树是一个满二叉树,如下图所示,此时,删除任何一个叶子节点都会不满足2-3树的 定义,那么我们就需要合并成3结点,6、7成为3结点后,树的高度不平衡,所以我们需要继续调整,把9,14变成3结点,这才满足定义。

3)所删除的元素位于非叶子的分支结点。我们通常是将树按中序遍历得到此元素的前驱或者后继元素,进行补位。

  1. 如果我们要删除的分支结点是2结点。如下图,删除4结点,可以得到前驱是1后继是6,由于6、7是三结点,所以利用6来补位即可。
  2. 如果我们要删除的分支结点是3结点,如下图,删除12时,需要补位讲10移动到3结点位置。

PS:

2-3树到此理论基本讲完,后面删除操作实际上情形不止这些,由于2-3树是为了更好理解B树和B+树,所以对于深究和代码块可以不用深入了解,若以后需要,代码部分我会补上。

代码可参考https://philoscience.iteye.com/blog/1401962

2-3-4树定义

定义::了解了2-3树,对于2-3-4树就容易理解了,相比于2-3树,加入了4结点的使用。一个4结点,包含小中大三个元素和四个孩子(或者没有孩子),孩子的位置就是按照大小排列的。

4结点如下图:


对于插入删除可以看如下图:

2-3-4树插入

(2-3-4插入流程图)

1.对于插入含有元素5的结点到4结点时,可以拆成3结点和2结点,然后调整位置。

2.插入含有元素6的结点和元素9的结点,直接增补成3结点和4结点。

3.插入含有元素8的结点时,由于是4结点,只能让父结点增补,补到2结点然后有三个孩子即可。

4.插入含有元素4的结点时,直接补成4结点。

5.插入含有元素3的结点时,由于是4结点无法插入,只能调整父结点,使其变成4结点。

2-3-4树删除

直接看流程图

1.若删除1和6,那直接删除即可。

2.若删除3,则子结点过多,需要合并,

3.删除4,直接删除

4.删除5,合并子结点。余下的都同理。

PS:

2-3树和2-3-4树都是为了B树做铺垫。

猜你喜欢

转载自blog.csdn.net/weixin_42513339/article/details/89016963