假设一个节点存储的元素个数为x
根节点:1<=x<=m - 1
非根节点┌m/2┐ - 1 <= x <= m - 1
如果有子节点,子节点个数为y = x + 1
根节点:2 <= y <= m
非根节点:┌m / 2┐ <= y <= m
比如m = 3, 2 <= y <= 3,因此可以称为(2,3)树、2-3树
比如m = 4, 2 <= y <= 4,因此可以称为(2,4)树、2-3-4树
比如m = 5, 3 <= y <= 5,因此可以称为(3,5)树
比如m = 6, 3 <= y <= 6,因此可以称为(3,6)树
比如m = 7, 4 <= y <= 7,因此可以称为(4,7)树
如下图所示:
? 根节点的范围就是1<=x<=m - 1,由于下面这是个4阶B树,所以x的取值范围就应该是1<=x<=3,也就是它存储元素的范围就是1~3
? 非根节点┌m/2┐ - 1 <= x <= m - 1,这个的意思是对m/2进行向上取整,然后再-1,所以取值范围就是1 <= x <= 3,也就是它存储元素的范围就是1~3
? 如果一个节点存储的元素个数为x,那么它的子节点的个数就是x + 1,如图所示,我们明显看到节点40的子节点个数就是2
假如我们要搜索的元素是50,那么我们就要找根节点40的右子树,然后元素50小于60,所以要找60的左子树上的元素,然后找到50
新添加的元素必定是添加到叶子节点
如图所示,我们要在树中添加一个元素,我们肯定是要添加的树的叶子节点中的
插入55
如果插入55,我们首先比较55是大于根节点40的,所以我们55应该是在40的右子树上,然后55小于60,所以应该插到60的左子树上,55大于50,又因为,这棵树是4阶B树,非根节点存储的元素范围是:┌m/2┐ - 1 <= x <= m - 1,也就是1~3,所以直接将55插入到元素50的后面,如下图:
插入95
插入95的步骤和上面插入55的步骤相同,如下图:
再插入98呢?
但是,当我们往树中插入98之后,因为我们刚刚计算过,非根节点存储的元素范围是1~3,所以当我们要插入一个98的时候,很明显就会出现错误,也就是:
下面我们举一个列子进行说明:
插入98
插入52
插入54
我们可以很清楚的看到,当我们要插入98的时候,我们右下角节点已经满了,所以我们选取这个节点的中间节点,也就是95,记录它的位置为k,然后我们将95和它的父节点进行合并,然后将[0,k - 1]和[k + 1,m - 1]位置的元素分裂成2个字节点,后面的一次类推,我就不一一赘述了。
假如需要删除的元素在叶子节点中,那么直接删除即可
删除30
假如需要删除的元素在非叶子节点中
删除60
假如,这是一颗5阶B树,我说的是假如,当我们要去删除22元素的时候,我们知道5阶元素,其非根节点的存储范围是┌m/2┐ - 1 <= x <= m - 1,也就是2 <= x <= 4,所以删除22节点之后,很明显就发生了错误
这种现象称为:下溢(underflow)
原文:https://www.cnblogs.com/coderD/p/14589530.html