复习位置:数据结构 → 第7章 查找 → B树
这一篇只解决:关键字、阶、结点、孩子数量之间的关系。
一、B树是什么
B树可以理解成:
"一个结点里可以放多个关键字"的平衡查找树。
它的目的之一是降低树高,从而减少查找时访问结点的次数。
二、什么是关键字
例如一个结点:
[ 5 | 11 ]
这里的:
5、11
就是两个关键字。
它们把查找范围切成:
[5 | 11]
/ | \
<5 5~11 >11
所以最重要的关系:
k个关键字
→ k+1棵子树
例如:
2个关键字
→ 3棵子树
三、什么叫m阶B树
m阶表示:
一个结点最多有m棵子树
所以最多有:
m-1个关键字
直接记:
最大子树数 = m
最大关键字数 = m-1
例如5阶B树:
最多5棵子树
最多4个关键字
四、ceil(m/2)是什么意思
记作:
⌈m/2⌉
意思是:
m÷2后向上取整
例如:
m=4 → ⌈4/2⌉=2
m=5 → ⌈5/2⌉=3
经常记:
k = ⌈m/2⌉
它表示:
除根以外的非叶结点,最少要有k棵子树。
五、m阶B树的核心规定
1. 每个结点最多
m棵子树
m-1个关键字
2. 根结点如果不是终端结点
至少:
2棵子树
1个关键字
3. 除根以外的非叶结点
至少:
⌈m/2⌉棵子树
因此至少:
⌈m/2⌉-1个关键字
4. 所有叶子结点在同一层
因此B树始终保持平衡。
六、终端结点和叶子结点
在常见408教材定义中:
终端结点:
最下面一层真正存关键字的结点
叶子结点:
终端结点下面空指针所对应的外部结点
例如:
[5 | 11]
/ | \
[1|3] [6|8] [13|15]
↓↓↓ ↓↓↓ ↓↓↓
空 空 空
其中:
[1|3]、[6|8]、[13|15]
→ 终端结点
最下面的"空"
→ 叶子结点/外部结点
七、查找过程
假设当前结点:
[20 | 40]
查找35:
35 > 20
35 < 40
所以进入中间子树。
基本流程:
当前结点内比较关键字
→ 判断进入哪棵子树
→ 到下一层继续
八、考前速记
m阶B树:
最多m棵子树
最多m-1个关键字
非根内部结点:
至少⌈m/2⌉棵子树
至少⌈m/2⌉-1个关键字
根若非终端:
至少2棵子树
至少1个关键字
k个关键字
↔ k+1棵子树