一.基础知识
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不行了,再次合体
完成