B +树可以看作是乙树的一种变形,在实现文件索引结构方面比乙树使用得更普遍。
1.B +树的定义:一颗米阶B +树是乙树的特殊情形,它与乙树的不同之处在于:
(1)所有关键码都存放在叶子结点中,上层的非叶子结点的关键码是其中树中最小(或最大)关键码的重写。
(2)叶结点包含了全部关键码即指向相应数据存放地址的指针,且叶结点本身按关键码从小到大顺序链接。
关于每个非叶结点的结构有两种处理方式。如果安下层结点“最小关键码复写”原则,则树中每个非叶结点中有米颗子树必有M-1个关键码,
关键码KI(1 <= I <M)是指针裨所指子树中最小的关键码。如果按下层结点“最大关键码复写”原则,则每个非叶结点中有米颗子树必有米个关键码。
为了讨论方便采用“最大关键码复写”原则定义B + S树。
一颗米阶B +树的结构定义如下:
(1)每个结点最多有米颗子树(子结点);
(2)根结点最少有两个子树,除根结点外,其他极点至少有[M / 2]个子树;
(3)所有叶结点在同一层,按从小到大的顺序存放全部关键码,各个叶结点顺序链接;
(4)有Ñ个子树的结点有Ñ个关键码;
(5)所有非叶结点可以看成是叶结点索引,结点中关键码的Ki与指向子树的指针裨构成对子树(即下一层索引块)的索引项(KI,PI) ,奇是子树中最大的关键码。
如图所有非叶结点中子树棵树2 <= N <= 4,其所有的关键码都出现在叶结点中,且在叶结点中关键码有序地排序。上面各层非叶结点中的关键码都是其子树上最大关键码的副本。由此可知,B +树的构造是自下向上的,米限定了结点的大小,从下向上地把每个结点的最大关键码复写到上一层结点中。
叶结点中存放的是对实际数据记录的索引,每个索引项(KI,PI)给出数据记录的关键码及实际存储地址。
通常B +树中有两个头指针:一个指向B + SH树的根结点,另一个指向关键码最小的叶结点因此,可以对B +树进行两种搜索运算:一种是循环叶结点自己拉起的链表顺序搜索,另一种是从根结点开始,进行自顶向下,直到叶结点的随机搜索。
在B +树上进行随机搜索,插入和删除的过程基本上和乙树类似。只是在搜索过程中,如果非叶结点上的关键码等于给定值,搜索并不停止,而是继续沿右指针向下,一直查到叶结点上的关键码。因此,在B +树中,不论搜索成功与否,每次搜索都是走了一条从根到叶结点的路径。
参考文献:殷人昆数据结构:用面向对象方法与C ++语言描述(第二版)