B-树
B-树是一种平衡的多路查找树,在文件系统中很有用。
一颗m阶的B-树,或为空树,或为满足下列特性的m叉树:
1)树中每个结点至多有m棵子树
2)若根节点不是叶子结点,则至少有两棵子树
3)除根结点之外的所有非叶子节点至少有⌈m/2⌉棵子树
4)每个结点有至少有⌈m/2⌉-1个关键字, 至多有m-1个关键字,且关键字从小到大依次排序
5)非叶子结点的关键字个数=指向儿子的指针个数-1
6)所有叶子结点都出现在同一层次上
3阶B-树示意图:
B-树的查找
首先在根节点中查找(可以用顺序查找法,也可以用二分查找法),如果找到给定值的关键字,则查找成功,否则,确定要查找的关键字在Ki与Ki+1之间,Pi为子树根节点的指针,如果在Pi所指的子树中继续查找,直到找到,或者指针Pi为空时查找失败
B-树的插入
在最底层的某个叶子结点添加该关键字,如果该结点的关键字个数小于m-1,则插入该关键字后仍符合B-树的要求,否则要产生结点的分裂。
分裂的方法:
生成一个新结点;把原来结点的关键字与关键字k按升序排序后,从中间位置把关键字(不包括中间位置的关键字)分成两部分。左部分所含关键字放在旧结点中,右部分所含关键字放在新结点中,中间位置的关键字连同新结点的存储位置插入到父节点中。如果父节点的关键字个数也超过m-1,则再分裂,再向上插入,直至这个过程传到根节点为止。
B-树的删除
在B-树上删除关键字k的过程分两步完成:
1) 利用B-树的查找方法找出该关键字所在的结点,然后根据关键字 k所在结点是否为叶子结点有不同的处理方法
2) 若该结点为非叶结点,且被删关键字为该结点中第i个关键字key[i],则可从指针son[i]所指的子树中找出最小关键字Y,替代key[i],然后在叶结点中删去Y。
因此,把在非叶结点删除关键字k的问题就变成了删除叶子结点中的关键字的问题了。
在B-树叶结点上删除一个关键字的方法:
首先将要删除的关键字k直接从该叶子结点中删除,然后根据不同情况分别作相应的处理:
(1)如果被删关键字所在结点的关键字个数n>=⌈m/2⌉,说明删去该关键字后该结点仍满足B-树的定义。这种情况最为简单,只需从该结点中直接删去关键字即可。
(2)如果被删关键字所在结点的关键字个数n等于⌈m/2⌉-1,说明删去该关键字后该结点将不满足B-树的定义,需要调整,分为两种情况:
1)如果与该结点相邻的左兄弟(或右兄弟)结点中的关键字数目大于⌈m/2⌉-1,则可将左兄弟(或右兄弟)结点中最大(或最小)关键字上移至双亲结点,而将双亲结点中大于(或小于)该上移关键字的关键字下移至被删关键字所在结点中。
2)如果与该结点相邻的左兄弟(或右兄弟)结点中的关键字数目均等于⌈m/2⌉-1, 需把要删除关键字的结点与其左兄弟(或右兄弟)结点以及双亲结点中分割二者的关键字合并成一个结点。也就是在删除关键字后,该结点中剩余的关键字加指针,加上双亲结点中的关键字Ki一起合并到Ai所指的兄弟结点中去。如果因此使双亲结点中关键字个数小于⌈m/2⌉-1,则依次类推做相应的处理。