多路查找树

      在前面专题中讲的BST、AVL、RBT都是典型的二叉查找树结构,其查找的时间复杂度与树高相关,都是在内存中进行的。那么降低树高自然对查找效率是有所帮助的。

    另外还有一个比较实际的问题:就是大量数据存储中,实现查询这样一个实际背景下,平衡二叉树由于树深度过大而造成磁盘IO读写过于频繁,进而导致效率低下。那么如何减少树的深度(当然不能减少查询数据量),一个基本的想法就是:

1. 每个节点存储多个元素(但元素数量不能无限多,否则查找就退化成了节点内部的线性查找了)。

2. 摒弃二叉树结构,采用多叉树(由于节点内元素数量不能无限多,自然子树的数量也就不会无限多了)。


  多路查找树(muitl-way search tree) 每个节点的孩子可以树可以多余两个; 每个节点可以存储多个元素;

           1、2-3树
                每个节点都具有2个孩子(称之为2节点)或者3个孩子(称之为3节点)。
          一个2节点包含一个元素和两个孩子(或没有孩子)。

                                  一个3节点包含两个元素和三个孩子(或没有孩子)。

      1.1. 2-3树的插入实现

     1.对于空树 插入一个节点直接插入就好。

     2.插入节点到一个2节点的叶子上。  比如插入3

      

           3.将一个节点插入到原来上3节点的叶子上

      3.1要在3节点上插入,此时3节点的上面是2节点 则将 上面的2节点变成3节点  比如插入5

       

        3.2 要在3节点上插入,此时3节点上面是3 节点 则将上面首次出现为2节点的节点变成3节点。比如插入11

            

       以前我们普通叉树 插入时都是在叶子节点后添加,这样会导致二叉树的高度不断增加。查找困难。

         此时 我们用2-3树时重复分利用特性。 往上寻找有用空间 进行有效的利用

          3.3 要在3节点插入数据时  ,该3节点往上遍历都是3节点,这时要扩展高度了。



   1.2     2-3树的删除实现。

             1.要删除的数位于3节点地址上。 3节点 ->2节点就好  比如删除6

          

           

             2.要删除的数位于2叶子节点上。

                   1.此叶子节点上一级是2节点,但是他有一个3节点的有孩子。

               

                   2.叶子节点上一级是2节点,但是他有一个2节点的有孩子。

               

                    3.此叶子节点双亲是一个3节点。

             

                    4.删除的是一个满二叉树叶子节点

               

                 5.  要删除的元素位于非叶子节点的分支上。

                     当是2节点时 则按照中序遍历 找此节点前面或者后面的数顶底下。

                      

                     当是3 节点的时候  将3节点的左孩子提升上去 

                       

           2-3-4理论上跟2-3树是一样的 。  



关注公众号 海量干货等你
原文地址:https://www.cnblogs.com/sowhat1412/p/12734452.html