赞
踩
B树是一种平衡的多路查找树。
一棵m阶的B树(B树中所有结点的孩子个数的最大值为m),或为空树,或为满足下列特性的m叉树:
(1) 树中每个结点至多有m棵子树,至多含有m-1个关键字;
(2)若根结点不是叶子结点,则至少有两棵子树;
(3) 非根非叶节点至少有 ⌈m/2⌉ 棵子树,至少含有 ⌈m/2⌉-1课子树;
(4)所有的非终端节点中包含下列信息数据
(5)所有的叶子结点都出现在同一层次上,并且不带信息(可以看作是外部结点或查找失败的结点,实际上这些结点不存在,指向这些结点的指针为空)。
我们可以借助实例来分析,例如下图所示为一棵3阶的B树。
注意:绿色和黄色标记的结点是内部结点,最下面一层蓝色标记的是外部结点。
通过这颗3阶B树,我们可以得到他的一些性质:
(1)节点孩子的个数等于该结点中的关键字个数+1。
(2) 根据 (1)性质可得如果根结点有关键字,则它的子树的个数必然大于或等于2。
(3) 结点中的关键字都是有序的(递增或递减), 关键字两侧均有指向子树的指针,左指针所指子树的所有关键字都小于该关键字,右指针所指子树的所有关键字都大于该关键字。
(4) 下层结点的关键字总是落在有上层结点关键字所划分的区间内。例如本实例3阶B树第二层最右边结点的关键字13 和18划分了3各区间:(-∞,13),(13,18),(18,∞)。
(5)所有叶节点均在第4层上,代表查找失败的结点。
【例-1】下图所示的是一颗()
A.4阶B树 B.4阶B+树 C.3阶B树 D.3阶B+树
➸欢迎评论区留言
(1)插入:
注意:如果插入前B树非空,那么插入位置一定在最底层中的某个非叶节点。
有前面讲的B树的特性可知,所有结点中关键字的个数n满足 ⌈m/2⌉-1<= n <= m-1 , 若插入后的关键字的个数小于m,则可直接插入。也就是每当插入一个结点后,都要检查节点内关键字的个数,看是否满足B树的条件。当插入结点的关键字个数大于m-1,必须对结点进行分裂。
(2)分裂:
从中间位置 ⌈m/2⌉ 将其中的关键字分为两部分,左边部分的关键字放在原节点中,右边部分放到新的节点中。中间位置 ⌈m/2⌉ 的节点插入有以下两种情况:
✭ 如果没有双亲节点,新建一个双亲节点,B树的高度增加一层。
✭ 如果有双亲节点,将中间位置的节点插入到双亲节点中去。
分裂的过程:
【例-2】关键子序列为:
(1 ,2 ,6, 7 ,11 ,4 ,8,13, 10 ,5,17 ,9 ,16, 20 ,3 ,12 ,14, 18 ,19 ,15)。
创建一颗5阶B数。
注意: 最多关键字的个数Max = m-1 = 4。
小伙伴们,如果觉得有帮助,可以练习下面几道例题.
【例-3】关键子序列为:(5,6,9,13 ,8,2,12,15)。创建一颗4阶B数。
注意: 最多关键字的个数Max = m-1 =3
【例-4】关键子序列为:(20 30 50 52 60 68 70)给出创建一颗3阶B树。
注意: 最多关键字的个数Max = m-1=2
✭ 由前面讲的B树的性质我们知道,在一棵m阶B树中,所有非根非叶节点的关键字个数≥ ⌈m/2⌉-1,所以当我们对结点中的关键字删除后,也要保证其结点内的关键字个数≥ ⌈m/2⌉-1。
✭ 当删除的关键字K不在最底层非叶结点时,我们可以用其前驱或后继K1来替代K,然后在相应的结点删除K,
我们开看看下面删除的实例吧:
在下图的的4阶B树中删除关键字9,我们用它的前驱8来替代,然后在相应节点中删除8。
关键字个数Min=⌈m/2⌉-1=1
✭当被删除关键字在最底层非叶结点时,有下列三种情况。
♔♔直接删除关键字。若被删除关键字所在结点的关键字个数≥ ⌈m/2⌉,则直接删除关键字
♔♔兄弟够借。若被删除关键字所在结点的关键字个数= ⌈m/2⌉-1,并且其左右兄弟结点中的关键字个数≥ ⌈m/2⌉,则需要调整左右兄弟以及双亲结点的位置。
我们开看看一个具体实例:
在下图的的4阶B树中删除关键字7
♔♔兄弟不够借。若被删除关键字所在结点的关键字个数= ⌈m/2⌉-1,并且其左右兄弟结点中的关键字个数=⌈m/2⌉-1,则将关键字删除后,将其左(或右)兄弟与其双亲结点合并。
我们开看看一个具体实例:
在下图的的4阶B树中删除关键字5
今天就先暂时写到这了,水平有限,哪里写的不好,还请谅解,有问题欢迎评论区留言!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。