1. 什么是B树/B-树?
1.1 名称误区
此部分参考1。
B树,即B-tree树,B是Balanced首字母,平衡的意思。
因为B树的原英文名称为B-tree,很多人喜欢把B-tree译作B-树,然后读作B减树。
其实,这么是不对的。
容易让人会以为B树和B-树是两种树。
特此声明:B-树就是指的B树。
1.2 概念
此部分参考2。
B树是一种自平衡树数据结构。
m阶B树是满足以下性质的树:
- 有根节点、内部节点3、叶子节点4三种节点。
- 每个节点最多有m个子节点。
每个内部节点至少有 ⌈ m /2⌉ 个子节点。5每个非叶节点至少有两个子节点。6所有叶子都出现在同一水平面上。7- 具有k个子节点的非叶节点包含k -1 个键。8
以上图片为引用图。9
B树属于多叉树、平衡多路查找树(查找路径不止两个)。
1.3 插入
此部分参考9。
插入操作是指插入一条记录,即(key, value)的键值对。
- 如果B树中已存在需要插入的键值对,则用需要插入的value替换旧的value。
- 若B树不存在这个key,则一定是在叶子结点中进行插入操作10。
1)根据要插入的key的值,找到叶子结点并插入。
2)判断当前结点key的个数是否小于等于m-1,若满足则结束,否则进行第3步。
3)以结点中间的key为中心分裂成左右两部分,然后将这个中间的key插入到父结点中,这个key的左子树指向分裂后的左半部分,这个key的右子支指向分裂后的右半部分,然后将当前结点指向父结点,继续进行第3步。
1.4 删除
未完待续。
1.5 B树在数据库的应用
主要用于索引结构(还没深入了解)。
2.B+树
该部分参考教材11。
2.1 概念
- 基础还是一颗B树。
- 数据只字叶子节点上有,非叶子节点的指针指向的是子节点的地址。
- 叶子节点最多包含m-1个指向数据的指针(与m-1个关键字对应),及1个指向含下一个关键字记录的指针12。
- 非叶子节点(索引节点)的第一个关键字对应第二个指针所指子树,第二个关键字对应第三个指针所指子树,每个关键字等于对应子树的叶子节点中最小的关键字13。
除根节点外,其他所有节点中所含关键字的个数最少有 ceil(m/2)(注意:B 树中除根以外的所有非叶子节点至少有 ceil(m/2) 棵子树)。(还没搞懂)
2.2 插入
直接看教材11。
注:下例的m=4,其中的根节点关键字13是被分裂时顶上去的,没分裂前他在没分裂的第二层的第二个的位置。
2.3 删除
未完待续。
内部节点(internal node):存储了数据以及指向其子节点的指针。 ↩︎
叶子节点(leaf node):与内部节点不同的是,叶子节点只存储数据,并没有子节点。 ↩︎
内部节点的子节点最少的时候是才被分裂出来的时候。让我们想象一个节点要分裂了,即在包含了m-1个键(m个子节点)时由被顶了一个键上来(一个子节点分裂了,变成m+1个子节点了):若m为奇数(以5为例),该节点有6个子节点,平均分配到一边3个√;若m为偶数(以4为例),该节点有5个子节点,分配到一边2个,一边3个√。 ↩︎
内部节点都是分裂出来的。 ↩︎
了解了构造方式自然就懂了。 ↩︎
每个内部节点的键充当分隔其子树的分隔值。例如,如果一个内部节点有 3 个子节点(或子树),那么它必须有 2 个键:a1和a2。 ↩︎
不会直接在非叶子节点的关键字处插入,非叶子节点的关键字都是被分裂时顶上来的。 ↩︎
B+ 树为了方便范围查询,叶子节点之间还用指针串联起来。 ↩︎
这是插入方式决定的,但也符合B+树的目的:小于该关键字的去这个关键字左边子树找,大于等于该关键字的去这个关键字右边子树找。 ↩︎