数据结构--2-3树

2-3 查找树(2-3-Search-Tree)

  • 2-结点:标准二叉树中的结点称为2-结点(含有一个键和两条连接)。git

  • 3-结点:包含两个键和三条连接。github

定义:一颗2-3查找树或为一棵空树,或由如下结点组成:微信

  2-结点,含有一个键(及其对应的值)和两条连接,左连接指向的2-3树中的键都小于该结点,右连接指向的2-3树中的键都大于该结点。3d

  3-结点,含有两个键(及其对应的值)和三条连接,左连接指向的2-3树中的键都小于该结点,中连接指向的2-3树中的键都位于该结点的 两个键之间,右连接指向的2-3树中的键都大于该结点。orm

2-3 查找树(2-3-Search-Tree) 的操做

一棵完美平衡的2-3查找树中全部空连接到根节点的距离应该都是相同的。cdn

查找

  2-3 查找树中的查找与二分搜索树的查找相似。要判断一个键是否在树中,先将它和根结点中的键比较。若是它和其中任意一个 相等,查找命中。不然,根据比较的结果找到指向相应区间的连接,并在其指向的子树中递归继续查找。若是是个空连接,查找未命中。blog

在如上图所示的2-3树中查找键为2的结点是否存在,过程以下:递归

在如上图所示的2-3树中查找键为17的结点是否存在,过程以下:get

插入

向2-结点中插入新键

  要在2-3树中插入一个新的结点,相似于二分搜索树的插入,先进行一次未命中的查找,找到要插入的结点所在的位置,将其挂在树的底部。 但这样一来树就没法保证完美平衡性。使用2-3的主要缘由:在插入新的结点以后可以继续保持平衡。it

  若是未命中的查找结束于一个2-结点,就将这个2-结点替换为3-结点,将要插入的键保存在其中便可。

  若是未命中的查找结束于一个3-结点,分析过程以下。

向一棵只含有一个3-结点的树中插入新键

  在考虑通常状况以前,先假设咱们须要向一棵只含有一个3-结点的树中插入一个新键。这棵树中有两个键,因此在它惟一的结点中 已经没有可插入新键的空间了。为了将新键插入,先临时将新键存入该结点中,造成一个4-结点(含有3个键和4条链接)。建立一个4-结点很方便, 由于很容易将其转化成为一棵由3个2-结点组成的2-3树,其中一个结点(根)含有中键,一个结点含有3个键中的最小者(和根结点的左连接相连), 一个结点含有3个键中的最大者(和根结点的右连接相连)。这棵树便是一棵含有3个结点的二叉查找树,同时也是一棵完美平衡的2-3树,由于其中全部的 空连接到跟结点的距离都相等。插入前树的高度是0,插入后树的高度是1。

向一个父结点为2-结点的3-结点中插入新键

  假设未命中的查找结束于一个3-结点,而它的父结点是一个2-结点。在这种状况下须要:在维持树的完美平衡的前提下为新键 腾出空间。 须要像刚才同样构造一个临时的4-结点并将其分解,但此时不会为中键建立一个新结点,而是将其移动到原来的父结点中。

  将此次转换当作将指向原3-结点的一条连接替换为新父结点中的原中键左右两边的两条连接,并分别指向两个新的2-结点。 根据假设,父结点中石油空间的:父结点是一个2-结点,插入以后变成了一个3-结点。另外,此次转换也不影响(完美平衡的)2-3树的 主要性质。树仍然是有序的,由于中键被移到父节点中去了;树仍然是完美平衡的,插入后全部的叶子结点到根结点的距离仍然相同。

上述过程是2-3树动态变化的核心,图示展现以下:

向一个父结点为3-结点的3-结点中插入新键

  假设未命中查找结束于一个父结点为3-结点的3-结点。依旧须要构造一个临时的4-结点并分解它,而后将它的中键插入它的父结点中。因为父结点也是一个3-结点,插入中间后又造成一个新的临时4-结点,而后在这个节点上进行相同的变换,集分解这个父结点并将它的中键插入的它的父结点中去。推广到通常的状况,就是这样一直向上不断分解临时的4-结点并将中键插到更高层的父结点,直到遇到一个2-结点并将它替换为一个不须要继续分解的3-结点,或者是到达3-结点的根。

图示过程以下:

分解根结点

  若是从插入节点到根结点的路径上都是3-结点,根结点最终变成一个临时的4-结点。此时能够按照向一棵只有一个*3-结点的树中插入新键的方法处理这个问题。将临时的4-结点分解为三个2-结点**,树高加1。此次最后的变化仍然保持了树的完美平衡性,由于它变换的是根结点。

图示过程以下:

4-结点的分解

  在2-3树4-结点出现的位置有以下的几种状况。

  • 1.根结点

  • 2.父结点为2-结点的左子结点或右子节点

  • 3.父节点为3-节点的左子节点、中间的子结点或右子结点

下面咱们来详细看一下在2-3树中出现上述的位置时如何分解。

情形:

当临时的4-节点出如今根节点:

当临时的4-节点出如今2-结点的左侧:

当临时的4-节点出如今2-结点的右侧:

当临时的4-节点出如今3-结点的左侧:

当临时的4-节点出如今3-结点的中间:

当临时的4-节点出如今3-结点的右侧:

上述的状况中,在变化的过程当中,只有当根节点最后为临时的4-节点,此时被分解成为3个2-结点时,整个树的高度才会增长1。除此以外,插入一个结点2-3树的高度仍是原来的高度。上述的变化过程当中:任何空连接到根节点的路径长度都是相等的。

结论

  在一棵大小为N的2-3树中,查找和插入的操做访问的结点必然不会超过lgN。

  • 证实:

一棵含有N个结点的2-3树的高度在在log2 N和log3 N之间。


我的微信公众号:

我的github:

github.com/FunCheney

相关文章
相关标签/搜索