2-3树插入、删除操作

一、定义

2-3查找树是平衡查找树的一种,也就是说左右子树高度相差不超过1,定义如下:

  1. 要么为空,要么:

  2. 对于2节点,该节点保存一个key及对应value,以及两个指向左右节点的节点,左节点也是一个2-3节点,所有的值都比key要小,右节点也是一个2-3节点,所有的值比key要大

  3. 对于3节点,该节点保存两个key及对应value,以及三个指向左中右的节点。左节点也是一个2-3节点,所有的值均比两个key中的最小的key还要小;中间节点也是一个2-3节点,中间节点的key值在两个跟节点key值之间;右节点也是一个2-3节点,节点的所有key值比两个key中的最大的key还要大

如果中序遍历2-3查找树,就可以得到排好序的序列。在一个完全平衡的2-3查找树中,根节点到每一个为空节点的距离都相同。

这里写图片描述

二、查找

这里写图片描述

三、插入

插入之前,先要对2-3树进行一次未命中的查找

1、向2节点中插入节点

如果未命中查找结束于一个2节点,直接将2节点替换为一个3节点,并将要插入的键保存在其中。
这里写图片描述

2、向3节点中插入节点

① 父节点是2节点

可以将新的元素插入到3-node节点中,使其成为一个临时的4-node节点,然后,将该节点中的中间元素提升到父节点即2-node节点中,使其父节点成为一个3-node节点,然后将左右节点分别挂在这个3-node节点的恰当位置。操作如下图:.

这里写图片描述

②父节点是3节点

当我们插入的节点是3-node的时候,我们将该节点拆分,中间元素提升至父节点,但是此时父节点是一个3-node节点,插入之后,父节点变成了4-node节点,然后继续将中间元素提升至其父节点,直至遇到一个父节点是2-node节点,然后将其变为3-node,不需要继续进行拆分。

这里写图片描述

③父节点到根节点均为3节点

当父节点到根节点都是3节点的时候,这是如果我们要在字节点插入新的元素的时候,会一直查分到跟节点,在最后一步的时候,跟节点变成了一个4节点,这个时候,就需要将跟节点查分为两个2节点,树的高度加1,这个操作过程如下:

这里写图片描述

3、变换

对于4节点变形为2-3节点,变形前后树的高度没有发生变化。只有当根节点是4节点,变形后树的高度才加一。变换不会影响树的全局有序性和平衡性。如下图所示:

这里写图片描述

三、删除

1、删除非叶子节点

使用中序遍历下的直接后继节点key来覆盖当前节点key,再删除用来覆盖的后继节点key

这里写图片描述

2、删除叶子节点

①删除节点不是2节点,直接删除

这里写图片描述

②删除节点是2节点

a:当前节点的双亲节点是2节点、兄弟节点是3节点,将双亲节点移动到当前位置,再将兄弟节点中最接近当前位置的key移动到双亲节点中

这里写图片描述

b:当前节点的双亲节点是2节点、兄弟节点也是2节点,先通过移动兄弟节点的中序遍历直接后驱到兄弟节点,以使兄弟节点变为3节点;再进行a的操作

这里写图片描述

c:当前节点的双亲节点是3节点,拆分双亲节点使其成为2节点,再将再将双亲节点中最接近的一个拆分key与中孩子合并,将合并后的节点作为当前节点

这里写图片描述

d: 2-3树是一颗满二叉树,将2-3树层树减少,并将兄弟节点合并到双亲节点中,同时将双亲节点的所有兄弟节点合并到双亲节点的双亲节点中,如果生成了4节点,再分解4节点即可

这里写图片描述

参考:
1、Robert Sedgewick. 算法 第四版[M]. 北京:人民邮电出版社,2012.10
2、大话数据结构

猜你喜欢

转载自blog.csdn.net/disiwei1012/article/details/78900594
2-3
今日推荐