只面向做题。
真题题意做了简短转述,保留年份、核心条件和考点。
一、考场先写这5行
m阶B树:
最多孩子 = m
最多关键字 = m-1
k = ⌈m/2⌉
非根内部结点:
至少k个孩子
至少k-1个关键字
根若不是终端:
至少2个孩子
至少1个关键字
二、题型1:问“至少多少关键字”
秒杀:
让树尽可能稀。
也就是:
根只放1个关键字
根只分2个孩子
以后每个非根内部结点
只分k=⌈m/2⌉叉
三、2013年408真题
题意:
一棵高度为2的5阶B树,
最少有多少个关键字?
选项:
A. 5
B. 7
C. 8
D. 14
计算:
m=5
k=⌈5/2⌉=3
根最少:
1个关键字
→ 2个孩子
第2层每个结点至少:
k-1=2个关键字
所以:
1 + 2×2 = 5
答案:
A. 5
秒杀点:
高度2
→ 根 + 一层孩子
四、2018年408真题
题意:
高度为5的3阶B树,
至少含多少个关键字?
选项:
A. 15
B. 31
C. 62
D. 242
计算:
m=3
k=⌈3/2⌉=2
最稀情况下,各层最少关键字:
第1层:1
第2层:2
第3层:4
第4层:8
第5层:16
总数:
1+2+4+8+16=31
答案:
B. 31
也可以直接:
n_min
=2k^(h-1)-1
=2×2^4-1
=31
五、2021年408真题
题意:
一棵高度为3的3阶B树,
根为第1层。
若第2层共有4个关键字,
则该树的结点数最多是多少?
选项:
A. 11
B. 10
C. 9
D. 8
3阶B树:
每个结点最多3个孩子
最多2个关键字
根最多3个孩子,所以第2层最多:
3个结点
第2层总共4个关键字,为了让结点数最大,可以分成:
2 + 1 + 1
因为:
关键字数 + 1 = 孩子数
所以第3层最多:
3 + 2 + 2 = 7个结点
全树:
第1层:1
第2层:3
第3层:7
总数:
1+3+7=11
答案:
A. 11
这题真正的关键:
关键字数 + 1 = 孩子数
六、题型2:插入
固定流程:
1. 找到应该插入的终端结点
2. 插入并排序
3. 若关键字数 ≤ m-1
→ 结束
4. 若出现m个关键字
→ 分裂
5. 第⌈m/2⌉个关键字上移
6. 父结点若再次溢出
→ 继续向上分裂
口诀:
插入满了:
分裂,中间上移。
七、题型3:删除
固定流程:
删后不低于最少关键字数
→ 直接删
删后太少
→ 看兄弟能不能借
能借
→ 通过父结点调整
不能借
→ 当前 + 父分隔关键字 + 兄弟 合并
口诀:
删除少了:
先借,借不到就合。
八、题型4:问高度
最大高度
→ 让树尽量稀
最小高度
→ 让树尽量满
公式:
k=⌈m/2⌉
最大高度:
floor(log_k((n+1)/2))+1
最小高度:
ceil(log_m(n+1))
如果公式不熟:
现场按层算
通常更稳。
九、最容易错的4件事
1. 把m阶理解成最多m个关键字
错。
m阶
→ 最多m个孩子
→ 最多m-1个关键字
2. 忘记根特殊
普通非根内部结点至少:
⌈m/2⌉个孩子
根若不是终端:
只要求至少2个孩子
3. 把⌈m/2⌉当普通除法
例如:
m=5
⌈5/2⌉=3
4. 关键字和孩子数记反
一定是:
k个关键字
→ k+1个孩子
十、30秒速记
m阶:
最多m孩子,m-1关键字。
k=⌈m/2⌉:
非根内部结点至少k孩子,k-1关键字。
根非终端:
至少2孩子,1关键字。
插入:
满 → 分裂 → 中间上移。
删除:
少 → 借 → 借不到合并。
求最高:
尽量稀。
求最低:
尽量满。
关键字数+1:
就是孩子数。

313

被折叠的 条评论
为什么被折叠?



