B树、B+树及B*树

在前面章节介绍了各类二叉树,本章节介绍下另一系列的树结构:B树(Balanced tree)。

B树

B树是1970年 R.Bayer 和 E.mccreight 提出的一种平衡的多叉树,是一种搜索树,又称B-树。一棵m阶的B树符合如下条件:

  • 1、根结点至少有两个子女(要么是空树,要么肯定有2个节点以上才会分裂);
  • 2、每个非根节点至少包含有m/2棵个关键字(节点分裂后,单节点最少有m/2),且最多有m-1个关键字(达到m个关键字需要分裂);
  • 3、除根结点以外的所有结点(不包括叶子结点)的度数正好是关键字总数加1;
  • 4、所有的叶子结点都位于同一层。

B树跟红黑树、平衡二叉树不同,不需要左旋右旋的操作来保持树的平衡,但每次数据的变更导致节点达到树的阶数时,需要从叶子节点开始往父节点延伸数据,并将当前节点平均分裂为两部分。
关于B树的构建过程,可以自行查看这个网站的动态效果,更能帮助我们理解B树的构建过程:
动态构建B树
从构建过程我们知道,构建B树的值,可能是非叶子节点的关键字,也能是叶子节点。搜索过程中,从根节点逐层往下判断,由于B树的内容是有序的,因此通过搜索树的判断方法,逐层往下寻找,直到找到搜索内容。

下图是一棵B树示例:


B树

B+树

B+树是从B树的基础上扩展出来的,跟B树不同的是,B+树的值全部会出现在叶子节点,部门内容也会在非叶子节点作为关键字存在。B+树的搜索跟B树不同,即使关键字跟搜索内容相同,也必须继续往下搜索(关键字节点只有索引内容,不存索引内容对应的值),达到最下层叶子节点。
B+树的定义基本与B-树相同,除了:

  • 1、所有关键字都会在叶子结点出现;
  • 2、非叶子结点的子树指针与关键字个数相同;
  • 3、所有的叶子结点都有一个链指针指向相邻的叶子节点;
    B+树的动态构建效果可以参考这个页面:
    动态构建B+树
B+树

B+树的如下两个特点使得B+树特别适合用在数据库的数据存储及索引上面:

  • 1 、所有内容都在叶子节点:关键字节点作为索引存在,而叶子节点顺序存储所有的元素值。
  • 2、叶子之间顺序且指针关联:搜索不到的情况下便于找到下一个节点的位置,而不需要像B树一样从头开始定位,做全表扫描的时候非常方便。
    而B树比B+树相比的优点是,由于数据可能存在所有节点,不需要每次都达到最深节点,因此访问更迅速。

B*树

B树是在B+树基础上的又一种变形,相比B+树,B树多了如下两个区别:

  • 1、在关键字节点也包含了指向兄弟节点的指针。
  • 2、当一个节点慢了,不会马上考虑做数据对半拆分,而是优先考虑把数据转移到兄弟节点,从而一定程度上降低了分配新节点的可能性,提高了空间利用率。


    B*树

总结

最后,我们对B树、B+树、B*树做一个总结。

  • 1、B树是一种M阶多路搜索树,每个节点都会携带数据,节点数据满的时候做拆分。
  • 2、B+树在B树的基础上增加了数据全在叶子节点,以及叶子节点之间有链表的特点,使其非常适合用在数据库的数据存储上。
  • 3、B*树在B+树基础上增加了非叶子节点的链表以及拆分时候的优化,进一步提高了空间使用率。

你可能感兴趣的:(B树、B+树及B*树)