BTree —— 多路查找树
2-3树
多路查找树中的每一个结点都具有两个或者三个孩子我们称之为2-3树。
2-3树的所有叶子都在同一层次。
插入原理
对于2-3树的插入来说,与二叉排序树相同,插入操作一定是发生在叶子结点上。但与二叉树不同的是,2-3树插入一个元素的过程有可能会对该树的其余结点产生连锁反应。
以这个图为例:
插入分为三种情况:(根据上图来插入)
第一种:对于一个空树,直接插入一个结点就可以。
第二种:插入结点到一个二结点的叶子上。
只需将二结点变为三结点即可。例:插入3
第三种:要往三结点中插入一个新元素。
① 我们要进行拆分。
例:插入5
例:插入11
② 增加高度
例:插入2,拆解,从下往上拆
删除原理
2-3树的删除也分三种情况,与插入相反。
第一种:要删除的元素是位于三结点的叶子上的结点。
直接将其转换为二结点即可。例:删除6
第二种:要删除的结点位于二结点的叶子上
①此节点的双亲也是一个二结点,并且拥有一个三结点的右孩子。例:删除1
②此节点的双亲是一个二结点,它的右孩子也是一个二结点。例:删除4
③此结点是一个二结点,双亲是一个三结点。例:删除10
④当前树是满二叉树的情况。例:删除8
第三种:删除的结点不是叶子结点。
① 要删除的分支是个二结点。 例:删除4
② 要删除的是三结点中的某一元素。例:删除12
2-3-4树
有了上面2-3树的基础,2-3-4树就很好理解了。
有四结点的使用,一个四结点要么没有孩子,要么有四个孩子。
B树
B树(BTree)是一种平衡的多路查找树,2-3树和2-3-4树都是B树的特例。
我们把结点最大的孩子树目称为B树的阶,因此,2-3树是3阶B树,2-3-4树是4阶B树。
一个m阶的B树具有如下属性:
- 根结点至少有两个孩子
- 每一个非根结点的分支结点都有K-1个关键字和K个孩子,其中K满足:[ m/2 ] <= K <= m ps: [ m/2 ]是向上取整
- 所有叶子结点都位于同一层
- 每一个分支结点包含下列信息数据:
n,A0,K1, A1,K2,A2,K3,A3……
其中K为关键字,且Ki < ki+1
Ai为指向子树根结点的指针
左侧黄色表示当前结点的元素个数。
B树的插入和删除,方式与2-3树和2-3-4树类似。
B+树
在B树中,我们在查找的时候往返于每个结点之间就意味着,我们必须要在硬盘的页面之间进行多次访问。这样就非常糟糕。有没有可能让遍历时每个元素只访问一次呢?
我们在原有B树的结构基础上,加上了新的元素组织方式,这就是B+树。
B+树是应文件系统所需而出的一种B树的变形树。在B树中,每一个元素在该树中只出现一次,有可能在叶子结点上,也有可能在分支节点上。而在B+树中,出现在分支结点中的元素会被当作它们在该分支结点位置的中序后继者(叶子结点)中再次出现。而且,每一个叶子结点都会保存一个指向后一个叶子结点的指针。
B树和B+树的应用
文件系统和数据库系统中常用的B/B+ 树,它通过对每个节点存储个数的扩展,使得对连续的数据能够进行较快的定位和访问,能够有效减少查找时间,提高存储的空间局部性从而减少IO操作。