查找算法(4)2-3查找树

一.2-3查找树定义

    前面的二叉查找树在最坏的情况下性能还是很糟糕的,所以我们需要保持二叉查找树的平衡性,不幸的是,在插入过程中保证树的完美平衡的代价太高了,所以我们稍稍放松完美平衡的要求

    2结点:每个结点包含一个元素和两个孩子(或者没有孩子)。其中左孩子小于该节点元素,右孩子大于该节点元素。 
    3结点:每个节点包含两个元素和三个孩子(或者没有孩子)。其中左孩子小于节点中较小元素,中孩子大于较小的小于较大的元素,右孩子大于较大的元素。 

     2-3树:由2结点和3结点组成的树,并且所有叶子节点都在同一层上


二.查找操作

(1)先将键值跟根节点中的键进行比较,如果和任意一个键值相等,则查找命中。
(2)否则,根据比较的结果,找到相应区间的链接,并在其指定的子树中继续查找。

(3)如果这是个空链接,那么查找失败。


三.插入操作

    1.向2-结点中插入新键

    (1)先进行一次未命中查找,然后把新节点挂在树的底部(但不能保证完美平衡性,需要采取操作)

    (2)如果未命中的结点是2-结点,将这个值加入2-结点组成3-结点

    (3)如果未命中的结点是3-结点,那么需要采取更多的措施

扫描二维码关注公众号,回复: 1710794 查看本文章

                            

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

     (1)先把新键临时存储到该结点,使它称为一个4-结点

    (2)将其分解成3个2-结点组成2-3树

                        

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

        (1)同样先将新键临时存储到该结点,使它称为一个4-结点,分解,但不会为中键创建一个新结点

        (2)而是将中键移到父节点中

                          

    4.向一个父结点是3-结点的3-结点中插入新键

        (1)同样先将新键临时存储到该结点,使它称为一个4-结点,分解,同3中的操作

        (2)此时父结点变成了一个4-结点,对新的4-结点进行同样的处理

                        

    5.分解根节点

        上面的4中,如果直至根节点仍然是4-结点怎么半呢?这时候就要参照1中的处理

                            

    四.分析

        结论:在一棵大小为N的 2-3树中,查找和插入操作访问的结点必然不超过logN个

        2-3树在最坏的情况下仍然有较好的性能,查找和插入的性能被保证在对数时间内

        但是这样实现2-3树不是很现实,因为有很多情况需要处理

    

猜你喜欢

转载自blog.csdn.net/qq_34645958/article/details/80774091