B-树

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,则依次类推做相应的处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值