一.B树(B-树)
B树,实际上是m阶的平衡树,相较于AVL树,B树的平衡是完全平衡,要求其每一个节点的左右子树的高度差都为0,B树常用于文件索引系统的实现。
1.B树的性质
一个m阶的B树需要满足:
1.树中每个节点都最多存在m个孩子。
2除了根节点和叶子节点外,每个节点至少存在ceil(m/2)个孩子(ceil是一个取上限的函数)
3.除了根节点外,其他的所有节点的关键字个数n都必须满足:[cile(m/2)-1]<=n<=m-1(叶子节点也必须满足)
4.B树仍然满足左边的值小于右边的值的搜索树的性质。
2.B树的插入操作
我们以5阶B树为例:
那么根据B树的性质,我们可以知道,其除了根节点外,每个节点至少存在3个孩子,至多5个孩子,所有节点的关键字数量n,2<=n<=4。
1.如果叶子节点空间足够,那么直接插入在叶子节点中,如图,假设这里插入的节点4最大:

2.如果节点空间不足,就要进行分裂,将一半的节点分裂到左中,一半的节点分裂到右,中间的节点上移成为父节点,同时,如果节点上移导致父节点也满了,那么父节点也同样需要分裂上移,如图,假设插入的节点5的值大于1,2,3,4:

3.B树的删除操作
我们同样以5阶B树为例:
首先查找B树中要删除的元素,若元素存在,则进行删除。删除该元素后,需要判断该元素是否有左右孩子节点
1.如果有,则上移孩子节点中的相近元素(左孩子中最右边的节点或者右孩子中最左边的节点)到父节点中去,如图删除节点A。

2.如果没有,直接删除,如图删除节点4。

删除元素,然后进行元素移动之后,如果节点关键字数目不满足条件(小于ceil(m/2)-1),则需要看其相邻的兄弟节点是否丰满(关键字个数大于ceil(m/2)-1)
1.如果丰满,则向父节点借一个元素来满足,再将兄弟节点提升到父节点中,如图,删除节点15:

2.如果其相邻兄弟都刚脱贫,即借了之后其结点数目小于ceil(m/2)-1,则该结点与其相邻的某一兄弟结点和它们的父节点进行"合并"成一个结点,以此来满足条件,如图,删除节点2。

4.在数据库索引中B树的磁盘I/O优势与搜索效率
前面我们提到,B树常用于文件索引系统,那么相较于其他的树形结构,B树强在哪里,我们这里使用AVL树与B树进行比较,从B树的磁盘I/O优势与搜索效率两个方面进行分析,假设我们有10000000个数据库索引需要从磁盘中读取并进行搜索:
从磁盘I/O上看:
对于AVL树,存储这些数据需要24层左右,由于AVL树的一个节点只存储一个数据,一次磁盘I/O只读取一个节点的数据,那么搜索一个数据最多需要进行进行24次磁盘I/O,然而对于一个B树来说,我们一般将其设定成300阶(保证一次磁盘I/O刚好能够读取),那么对于这些数据B树存储需要3层,那么搜索一个数据最多需要进行进行3次磁盘I/O,由此可见,B树拥有着很大的磁盘I/O优势。
从搜索效率来看:
与AVL树相同,B树在每一个节点中的搜索使用的都是二分查找。
二.B+树
B树的一种变形树,m阶的B+树和m阶的B树区别:
1.所有叶子节点包含全部关键字信息,及指向含有这些关键字记录的指针,且叶子节点中关键字进行有序链接
2.非叶子结点相当于是叶子结点的索引,叶子结点相当于是存储(关键字)数据的数据层;
B+树相当于B树的优化,使得树的高度更低,相对的磁盘I/O的读取次数更低,同时B+树的空间利用率更高。
三.B*树
B*树是B+树的变体,在B+树的基础上在B+树的非根于非叶子节点添加了指向兄弟节点的指针。
B*树相当于B+树的优化:相较于B+树,B*树的空间利用率更高。