7-4 查找—B树(数据结构)

一.基础知识
1.查找——树形结构——B树/多路平衡查找树
2.这是一棵五叉排序树(五个黑点)
最多能有4个关键字(蓝色),5个指针/分叉(黑点)
因此:关键字=分叉-1
在这里插入图片描述
3.B树的阶:树中结点最大的度(蓝色),图中为5
下面用m表示树的阶数

4.如果分叉=2,五叉退化为二叉树,没有意义,因此最好让:任何结点都至少有3个分叉,2个关键字。如果整棵树中只有一个元素,根节点无法满足该结论,所以以上结论不包括根节点
在这里插入图片描述
5.对于4的优化,若关键字总数不变,而每个结点内的关键字很少,会导致树很高,查找效率低。因此要尽可能的均衡
(1)m叉查找树中,规定对于任何一个结点,其所有子树的高度都要相同,即所有叶子节点都在最下面一层
在这里插入图片描述
(2)m叉树,蓝色节点中,除根节点外,所有结点至少有⌈m/2⌉个分叉,至少有⌈m/2⌉-1个关键字
(这里先不做证明)

6.终端结点与叶子结点
在这里插入图片描述
7.左<中<右
(1<3)<5<(6<8<9)<11<(13<15)<22…
在这里插入图片描述
用Pi表示分叉/指针,用Ki表示关键字,n为结点中关键字的个数
n的范围:⌈m/2⌉-1≤n≤m-1

拓展补充:
非根节点子树数:[⌈m/2⌉,m]
根节点子树数:[2,m]
根节点关键字数:[1,m-1]


所有非叶结点的结构
在这里插入图片描述
显然,K1<K2<K3<…
K左侧的P(所指子树)的关键字均小于K
K右侧的P(所指子树)的关键字均大于K

二.B树的高度
在这里插入图片描述
1.最小高度:每个结点尽可能的满
结点个数:1+m+m²+…+mh-1
结点内个数:m-1
因此总的关键字个数为两式相乘=mh-1
n为结点中关键字的个数,则必有n≤mh-1
解得h≥logm(n+1)

2.最大高度:每个结点中的关键字个数尽可能少

最少关键字数第二层:每个结点的关键字数为k-1,因此稍后要发送k-1+1个分支
在这里插入图片描述
求和得最少关键字总数=1+2(kh-1-1)
若关键字总数少于这个值,高度一定小于h,因此有n≥1+2(kh-1-1),化简得
h≤logk(n+1)/2+1=log⌈m/2⌉(n+1)/2+1

【法二】
结点个数(分叉个数)
第一层:1
第二层:2
第三层:2*⌈m/2⌉
第四层:2*⌈m/2⌉2
第h层:2*⌈m/2⌉h-2
第h+1层(叶子节点层,失败层):2*⌈m/2⌉h-1
因为n个关键字的B树有n+1个分支,有n+1个叶子节点,因此有n+1≥2*⌈m/2⌉h-1
解得h≤log⌈m/2⌉(n+1)/2+1
在这里插入图片描述
总结
在这里插入图片描述
三.B树的插入

插入88
88>49,88>60,88>80,88<90
在这里插入图片描述
插入到80和90之间,溢出
在这里插入图片描述
将88提到上层,90和99拆出
在这里插入图片描述
完成
当上层溢出时同样操作
如刚插入80导致溢出
在这里插入图片描述
80上移,88和93提出
在这里插入图片描述
注:
1.结点关键字的个数范围⌈m/2⌉-1≤n≤m-1
2.如果一直分裂到根节点可能导致B树的高度+1
3.插入永远是在终端结点处插入

四.B树的删除

1.对非终端结点的删除
可转化为对终端结点的删除
在这里插入图片描述
删除80,可以找到他的直接前驱77,删除80并将77移到80的位置
在这里插入图片描述
在这里插入图片描述
也可要找到他的直接后继82同理
在这里插入图片描述
其他元素前移即可
在这里插入图片描述
2.对终端结点的删除

插入考虑上限,删除考虑下限
结点关键字的个数范围⌈m/2⌉-1≤n≤m-1

如果删除后低于下限
(1)右兄弟富裕
在这里插入图片描述
38删除,38的后继49顶替,49的后继70顶替,71、72前移
在这里插入图片描述
完成
在这里插入图片描述
(2)右兄弟不行,左兄弟富裕
在这里插入图片描述
删除92,90后移,90的前驱88替补,88的前驱87替补
在这里插入图片描述
(3)左右兄弟都不行,合体
在这里插入图片描述
在这里插入图片描述
合体,73左移
在这里插入图片描述
此时73不行了,再次合体
在这里插入图片描述
完成
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡__卡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值