1、1.定义一棵m阶的B-树,或为空树,或为满足下列特性的m叉树:(l)所有的非终端结点的结构如下:其中,k1,k2,.,kn为n个按从小到大顺序排列的键值;p0,pl,p2,.,pn为(n+1)个指针,用于指向该结点的(n+l)棵子树,p0所指向子树中的所有关键字的值均小于kl,pn所指向子树中的所有关键字的值均大于kn,pi(1in-1)所指向子树中的所有关键字的值均大于ki且小于ki+1;n(nm-1)为键值的个数,即子树个数为(n+l)。np0k1p1k2p2kipiknpn1.定义(2)树中每个结点至多有m棵子树。(3)除非根结点为叶子结点,否则至少有两棵子树。(4)除根之外的所有非终端
2、结点至少有m/2棵子树。(5)所有叶子结点在同一个层次上,且不含有任何信息。2.说明(1)对于非根结点的所有分支结点,n的取值范围为m/2-1nm-1。(2)对于根结点,n的取值范围为1nm1。(3)对于叶子结点,其子树均为空树(即没有子结点),又规定不含有任何信息,可以把它看作不在树中的外部结点。(4)B-树的阶m可以事先任意指定,一旦指定后就固定不变。1501301 951 251 55270902 35 40atbcdfgeh图B-树3 75 80 85下图是一棵由10个键值生成的四阶B_树的示意图,该树共有四层,所有叶子点均在第四层上。1.查找方法l由B-树的定义可知,在B-树上进行查
3、找的过程与二叉排序树的查找类似。l根据给定的键值k,先在根结点的键值的集合中采用顺序(当m较小时)或二分(当m较大时)查找方法进行查找。l若有k=ki,则查找成功,根据相应的指针即可取记录;否则,若k在ki和ki+1之间,取指针pi所指的结点,重复这个查找过程,直到在某结点中查找成功,或在某结点处出现pi为空,查找失败.在B-树中进行查找时,其查找时间主要花费在搜索结点(访问外存)上,即主要取决于B-树的深度树的深度。问:含 N个关键字的 m 阶 B-树可能达到的最大深度 H 为多少?第第 2 层层 2 个个先推导每一层所含最少结点数:第第 1 层层 1 个个第第 H+1 层层 2(m/2)H
4、-1 个个第第 4 层层 2(m/2)2 个个第第 3 层层 2m/2 个个反过来问:深度为H的B-树中,至少含有多少个结点?假设m阶B-树的深度为H+1,由于第H+1层为叶子叶子结点,而当前树中含有N个关键字,则叶子结点必为N+1个,N+12(m/2)H-1 H-1log m/2(N+1)/2)Hlog m/2(N+1)/2)+1由此可推得下列结果:在含在含 N 个关键字的个关键字的 B-树上树上进行一次查找,需访问的结点进行一次查找,需访问的结点个数不超过个数不超过 log m/2(N+1)/2)+1结论:结论:在查找不成功之后,需进行插入。显然,关键字插入插入的位置位置必定在最下最下层的
5、非叶结点层的非叶结点,有下列几种情况:1)插入后,该结点的关键字个数nm,不修改指针;2)插入后,该结点的关键字个数 n=m,则需进行“结点分裂”,令s=m/2,在原结点中保留(A0,K1,Ks-1,As-1);建新结点(As,Ks+1,Kn,An);将(Ks,p)插入双亲结点;3)若双亲为空,则建新的根结点。例如:下列为3阶B-树50 20 40 80 插入关键字=60,60 80 90,60 80 90 90 50 80 60 30 40 20 30 50 808030 50l在深度为(h+l)的m阶B-树中删除一个键值k,首先要查到键值k所在的结点及在结点中的位置。若k在非终端节点中,则
6、把该结点的右边(或左边)指针所指子树中的最小(或最大)键值与k对调,使k移到终端节点。l在终端节点中删除一个键值后,使得该结点的值个数n减1,此时应分以下三种情况进行处理:(1)若删除后结点中键值数目nm/21,在该结点中删去键值k连同右边的指针。(2)若删除后结点中键值数目nm/21,且左(或右)兄弟结点的关键字数目m/21,则把左(或右)兄弟结点中最大(或最小)键值移到父结点中,再把父结点大于(或小于)上移键值的键值下移到被删关键字所在结点中。(3)若删除后结点中键值数目nm/21,及其左、右兄弟结点的键值数目都等于m/21,则就必须进行结点的“合并”,即把应删的键值删去后,将该结点中的剩
7、余键值和指针连同父结点中指向该结点指针的左边(或右边)一个键值ki一起合并到左兄弟(或右兄弟)结点中,将ki从父结点中删去。如果因此使父结点中关键字数目m/21,则对此父结点做同样处理,以致于可能直到对根结点做这样的处理而使整个树减少一层。3065 8025 4055 6070 758550(a)由上图删除35后的3阶B_树3065 802535 4055 6070 7585503065 7525 4055 6070 8050(b)删除85后的B_树3065 8025 4055 6070 7585503065 25 4055 6070 7550(c)删除80后的B_树3065 7525 405
8、5 6070 8050(b)删除85后的B_树3065 25 4055 6070 7550(c)删除80后的B_树50 65 70 7530 4055 60(d)删除25后的B_树对于m阶的B+树和m阶的B-树,主要的差异是:1)在B+树中,具有n个关键字的结点则含有n棵子树,即每个关键字对应一棵子树,而在B-树中,具有n个键值的结点含有(n+1)棵子树;2)在B+树中,每个结点(除树根结点外)中的键值个数n的取值范围是m/2nm,根结点n的取值范围是1nm;而在B_树中,它们的取值范围分别是m/21nml和lnm1。3)B+树中的所有叶子结点包含了全部键值,即其他非叶结点中的键值包含在叶结点
9、中,而在B-树中,叶结点包含的键值与其他结点包含的键值是不重复的。4)B+树中所有非叶结点仅起到索引的作用,即结点中的每个索引项只含有对应子树的最大关键字和指向该子树的指针,不含有该键值对应记录的存储地址。而在B-树中,每个键值对应一个记录的存储地址。5)通常在B+树上有两个头指针,一个指向根结点,另一个指向键值最小的叶子结点,所有叶结点链接成一个不定长的线性链表。40 6535 4060 6555 6540 45 5520 25 3015 30 4010 15roothead图图 B+树树二、二、B+树查找树查找在B+树中可以采用两种查找方式,一种是直接从最小键值开始进行顺序查找,另一种就是
10、从B+树的根结点开始进行随机查找。这种查找方式与B-树的查找方法相似,只是在分支结点上的键值与查找值相等时,查找并不结束,要继续查到叶结点为止,此时若查找成功,则按所给指针取出对应记录即可。因此,在B+树中,不管查找成功与否,每次查找都是经过了一条从树根结点到叶子结点的路径。三、三、B+树插入树插入与B-树的插入操作相似,B+树的插入也从叶子结点开始,当插入后结点中的键值个数大于m时要分裂成两个结点,它们所含键值个数分别为(m+1)/2和(m+1)/2,同时要使得它们的双亲结点中包含有这两个结点的最大键值和指向它们的指针。若双亲结点的键值数目因此而大于m,应继续分裂,依此类推。四、四、B+树删除树删除B+树的删除也是从叶子结点开始,当叶结点中最大键值被删除时,分支结点中的值可以作为“分界键值”存在。若因删除操作而使结点中键值个数少于m/2时,则从兄弟结点中调剂键值或和兄弟结点合并,其过程和B-树相似。l对下面的3阶B-树,依次执行下列操作,画出各步操作的结果。(1)插入90(2)插入25(3)插入45(4)删除60(5)删除80。503010060808203540