B树
1、概念
- 每个节点最多有m-1个关键字,m表示阶数(二叉树m=2)
- 根节点最少可以只有一个关键字
- 非根节点至少有Math.ceil(m/2)-1个关键字,一半左1个最少
- 每个节点中的关键字都按照从小到大顺序排列,每个关键字的左子树所有关键字都小于它,而右子树中的所有关键字都大于它
- 所有叶子节点都位于同一层,或者说根节点到每个叶子结点的长度都相同
1.1、翻译一遍: - 根节点不能为空,为空没法查找了
- 每个节点最多有m-1个关键字,因为关键字有左右空隙可以长出树枝,m-1个关键字刚好能长出m个树枝
- 非根节点至少有一半左1个关键字,再少的话增加深度,浪费空间,再多的话调整旋转的时候就比较麻烦,相当于一个权衡
- 同一节点关键字按序存储,左空隙的枝子都小,右空隙的枝子都大
- 所有叶子节点位于同一层,保证查找稳定
1.2、B树中数据的解释 - 每个节点存储了关键字key和关键字对应的数据data以及孩子节点的指针
- 把一个key和其对应的data称为一个记录
- 数据库应用中key表示键,data表示这个键对应的条目在硬盘上的逻辑地址
- 一般应用中B树的阶数m大于100
2、增删改查
2.1、插入
以5阶B树为例
a)在空树中插入39,此时根节点就1个key,根节点也是叶子结点
b)继续插入22,97和41,根节点有4个key
c)继续插入53,插入后大于5-1,此时以中间key 41为中心开始分裂仪式,分裂后小于它的在左孩子,大于它的在右孩子。
d)依次插入13,21,40,同样会造成分裂,结果如下图所示。
e)依次插入30,27, 33 ;36,35,34 ;24,29,结果如下图所示。
f)插入key值为26的记录,插入后的结果如下图所示。
当前结点需要以27为中心分裂,并向父结点进位27,然后当前结点指向父结点,结果如下图所示。
进位后导致当前结点(即根结点)也需要分裂,分裂的结果如下图所示。