B树
B树又称多路平衡查找树,B树中所有结点的孩子个数的最大值称为B树的阶,通常用m表示。一般从查找效率考虑,通常要求m>=3.

20210808193047.png
概念
一棵m阶b树或为空树,或为满足如下特质的n叉树:
树中每个结点至多有m棵子树,即至多含有m-1个关键字
若根节点不是终端结点,则至少有两棵树
除根结点外的所有非叶节点至少有【m/2】(向上取整)棵子树,即至少含有【m/2】(向上取整)-1个关键字
所有非叶节点的结构如下:
其中Ki(i=1,2,。。。,n)为结点的关键字,Pi(i=1,2,。。。,n)为指向子树根结点的指针

n
P0
K1
P1
K2
P2
Kn
Pn

所有的叶节点都出现在同一层次上,并且不带信息(可以视为外部结点或类似于折半查找判定树的查找失败结点,实际上这些结点不存在,指向这些结点的指针为空)
B树是所有结点的平衡因子均等于0的多路平衡查找树。
B树的高度
B树的高度不包括最后的不带任何信息的叶结点所在的那一层。
若n>=1,则对任意一棵包含n个关键字、高度为h、阶数为m的B树:

因为B树中每个结点最多有m棵子树,m-1个关键字,所以在一棵高度为h的m阶B树中关键字的个数应满足n<=(m-1)(1+m+m^2 +…+ m^h-1 )=m^h-1 ,因此有h>=logm(n+1)
若让每个结点中的关键字个数达到最少,则容纳同样多关键字的B树的高度达到最大。由B树的定义:第一层至少有1个节点;第二层至少有2个结点;除根结点外的每个非终端节点至少有【m/2】棵子树,则第三层至少有2【m/2】个结点。。。第h+1层至少有2(【m/2】^(h-1)),
注意到第h+1层是不包含任何信息的叶结点。对于关键字个数为n的B树,叶结点即查找不成功的结点为n+1,因此有n+1>2([m/2])^(h-1),即h<log[m/2] ( (n+1)/2)+1
查找
在B树上查找于二叉排序树很相似,只是每个结点都是多个关键字的有序表,在每个结点上所做的不是两路分支决定,而是根据该节点的子树所做的多路分支决定。
B树的查找包含两个基本操作:
1. 在B树中找结点
2. 在结点内找关键字。
由于B树常存储在磁盘上,因此前一个查找操作是在磁盘上进行的,而后一个查找操作是在内存中继续的。即在找到目标结点后,先将结点信息读入内存,然后在结点内采用顺序查找法,或折半查找法。
在B树上查找到某个结点后,先在有序表中进行查找,若找到则查找成功,否则按照对应的指针信息到所指的子树中去查找。查找到叶结点(对应指针为空指针)时,则说明树中没有对应的关键字,查找失败。
B+树
B+树是对应数据库所需而出现的一种B树的变形树。

20210808202317.png
概念
一棵m阶的B+树需满足下列条件:
每个分支结点最多有m棵子树
非叶根节点至少有两棵子树,其他每个分支结点至少有【m/2】棵子树
结点的子树个数于关键字个数相等
所有叶结点包含全部关键字及其相应记录的指针,叶结点中将关键字按大小顺序排列,并且相邻叶结点按大小顺序相互链接起来。
所有分支结点(可视为索引的索引)中仅包含他的各个子节点(即下一级的索引块)中关键字的最大值及指向其子节点的指针。
区别
在B+树中,具有n个关键字的结点只含有n棵子树,即每个关键字对应一棵子树;而在B树中,具有n个关键字的结点含有n+1棵子树。
在B+树中,每个结点(非根内部结点)的关键字个数n的范围是【m/2】<=n<=m(根节点:1<=n<=m);
在B树中,每个结点(非根叶结点)的关键字个数n的范围是【m/2】-1<=n<=m-1(根节点:1<=n<=m-1)。
在B+树中,叶结点包含信息,所有非叶结点仅起索引作用,非叶节点中的每个索引项只含有对应子树的最大关键字和指向该子树的指针,不含有该关键字对应记录的存储地址。
在B+树中,叶结点包含了全部关键字,即在非叶结点中出现的关键字也会出现在叶结点中;而在B树中,叶结点包含的关键字和其他结点包含的关键字是不重复的。