你心里没“B树”嘛?——之B树核心特性

本文深入浅出地解析了B树的关键特性,包括其绝对平衡的性质、关键字的分布规律,以及插入、查找和删除操作的详细过程。通过具体实例,帮助读者理解B树如何保持高效的数据检索和维护。

这里略过B树的定义,不知道的同学可以百度下,本文主要想通过最简短直接的总结下B树。让之前学过的但忘记的人能快速回忆。


m阶B树的核心特性

  1. 根节点子树个数∈[2,m]关键字个数∈[1,m-1]
  2. 其他结点子树个数∈[┌m/2┐,m]关键字个数∈[┌m/2┐-1,m-1]          (┌m/2┐:意为m/2向上取整)
  3. 对任一结点,其所有子树高度相同 (B树是绝对平衡的,即所有结点平衡因子均为0)
  4. 关键字的值:子树0<关键字1<子树1<关键字2<子树2<关键字3<…… (⭐重点)

关于┌m/2┐

B树中常出现┌m/2┐(m/2向上取整),为什么需要除根节点外的所有非叶子结点至少有┌m/2┐棵子树呢?

其原因在于如果B树不设置这个条件,若每个结点都只有1个关键字,则有2个子树,那么将导致整个树的高度会十分高,查找效率不高,整个B树会又瘦又高。而满足┌m/2┐也保证了查找效率。


B树的最大最小高度


B树的查找

  • 每个结点中的关键字都是有序排列的,这里从左向右→递增。
  • 查找两个基本操作:①在B树中找结点;②在结点内找关键字。

B树和二叉树一样遵循左小右大的准则,无论是结点与结点,还是每个结点内的关键字。

 

例如:查找上图关键字82。

①从根节点开始,根节点只有一个关键字80,根据左小右大,80<82,若82关键字存在的话,必定在关键字80右边的子树。

②查找关键字80右边的子树,而根节点右边子树有关键字88和93,82<88<93所以在关键字88左边的子树。

③查找关键字88左边子树,比较左子树内的关键字,最终找到了82。

若上个例子改为查找84,则①②都一样,而③中找不到84,再进行比较,82<83<84<86<87,所以84在关键字83的右子树,然而右子树为空,即查找失败。通常把查找到的关键字83和86之间的空结点成为失败结点。失败结点总是在最底层,即它们是叶子结点。而叶子结点的上面一层(83这一层)叫终端结点


B树的插入

下面把关键字用key表示。注意:只在终端结点插入。

①将新key插入到B树中时,首先通过B树的查找定位到所要插入的终端结点。一种情况,所插入位置的结点没满员,则正常插入;另一种,若某结点是满的,那么就需要将该结点分裂(关键字个数的取值在[┌m/2┐-1,m-1]   )

②分裂的方法:对需要分裂的结点,取中间位置(┌m/2┐)的key(这记该key为A)。A左边的所有key组成一个新结点,A右边的所有key组成另一个新结点。把A放进它父结点内,这里当然得和父结点内原有的key比较大小,再有序的插入。

 

图示举例:

例如:插入新key-78

①因为结点已经满员,插入新key就会溢出,所以需要分裂成2个新结点。

②找到中间key-76,把76放到父结点内。

③74和75结合为一个新结点,77和新插入的78结合为一个新结点。

这里2个新结点其实是和其他终端结点同一层的,只是画图画不下了。 

而插入新key后,B树还是保持着原来的特性,绝对平衡。


B树的删除

B树删除有2种情况:

一、删除指定key后,该结点内长度依旧满足不小于┌m/2┐-1的条件。

这种最简单,直接删除即可。

 

二、删除key后,该结点内长度小于┌m/2┐-1

因为自己结点内key不够,达不到单独作为一个结点的资格。所以就要向隔壁兄弟结点借一个key。下面也分为2种情况:

1)兄弟够借。兄弟的key大于┌m/2┐-1时,那么借给我一个key他没事,我也活了。

2)兄弟不够借。兄弟的key刚好等于┌m/2┐-1,那如果他借我,他自己必死,所以兄弟借不了。

 

举个栗子1:

【现要求删除key-33 】——兄弟够借的情况

1.该B树为m=5的5阶B树,所以┌5/2┐-1=2   所以最少key个数为2。

2.若删除33,结点内只剩一个key(小于2),所以必须向兄弟借,看兄弟够不够借,显然,相邻右兄弟结点key=3(大于2)够借。

3.如果直接把兄弟的key-70拿来给自己,就破坏了B树的性质,因为它的父结点里有49,不符合大小关系(70>49),所以让兄弟key-70去父结点,父结点key-49下来(谁大谁当爹?)。如下图:

 

 4.最后删除key-33后的B树如下图:

 

举个栗子2:

 【现要求删除key-90】——兄弟不够借的情况

1.同理,删除90后会出现key不足的现象。然而看看左右兄弟结点,它们key都刚好等于2,不能借给我。

 

2.我不能单独成组,那我就加入你们。该结点中还多一个key-92,把 92 和 父结点里的key-88 都加到左结点里去。

(注:①无论你加入左结点或右结点都是可以的,这里演示加入左。②为什么要拉一个父结点key一起加入呢?因为若直接把92加入左兄弟,导致92比88大,不符合B树。把“B树”藏于心

 

3.最后删除key-90后的B树,如图:

 

tips:在第2步骤中的另一种情况:若父结点只有1个key,拿走就没了,那么新生产的结点做为父结点。


 

 

 

 

帅哥美女总会随手点赞👍👍👍
帅哥美女总会随手点赞👍👍👍
帅哥美女总会随手点赞👍👍👍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值