B树
上图是一颗完整的5阶B树,符合以下特点:
- 对于一个m阶B树,每个节点最多有m个分支;根节点且不是叶子节点则至少有2个分支,而非根非叶节点至少有m/2(上取整)个分支。
- 有n(k <= n <= m)个分支的节点有n-1个关键字,它们按递增排列,k = 2(根节点)或m/2(上取整)
- 节点内各关键字互不相等
- 叶节点处于同一层,可以用空指针表示,是查找失败到达的位置
- 每个节点存储m-1个key和m个指针,指针Pi所指向的节点关键字小于Keyi+1大于Keyi
B树的查找
从根节点开始从左往右扫描节点中的关键字(二分查找),如果找不到就沿着适当分支到下一层查找,如果遇到了空指针则查找失败。
B树的插入
节点拆分:当前节点关键字个数等于阶数m时,需要将m/2(上取整)位置上的数提出来并为上一层节点的关键字中,此时如果上一层节点关键字个数也等于阶数m,则也进行拆分操作。
B树的删除
- 如果要删除的关键字位于叶节点且删除后,该节点关键字个数至少是m/2(上取整)- 1个,则直接删除。
- 如果要删除的关键字位于非叶节点上,则使用该节点左子树中最大的关键字或右子树中最小的关键字来替换要删除的关键字。
- 如果要删除的关键字所在节点达到了关键字个数的下限,则向他的兄弟节点借一个关键字,即将要删除关键字所在节点对应的上层节点中的关键字移到下层,并将要删除的关键字所在节点的兄弟节点最左或最右的关键字移到上层节点,例如删除下列B树的关键字15,先将17移下来再将18移上去即可。
- 如果要删除的节点关键字个数达到了下限并且它的兄弟节点关键字个数也达到了下限,即不能向兄弟节点借关键字了,则直接删除关键字,进行节点合并,并与具有较少关键字的兄弟节点进行合并(将该兄弟节点对应的上层关键字拉下来再进行合并),如果合并后,父节点关键字个数不满足下限则对上层节点也进行关键字的合并操作。例如删除下列B树中关键字5:
删除后B树可能有两种情况:
第一种是选择与右兄弟合并生成的,第二种是选择与左兄弟合并生成的。
B+树
B+树具有以下特点:
- 具有n个关键字的节点具有 n个分支,而B树具有n+1个分支
- m阶B+树,每个节点除根节点外,关键字个数m/2(上取整)<= n <= m,根节点关键字个数2 <= n <= m
- B+树中叶子节点包含信息,并且包含了全部关键字,叶子节点引出的指针指向记录
- B+树中非叶节点仅起到索引作用,不含有该关键字对应记录的存储地址
- B+树中有一个指针指向关键字最小的叶子节点,所有叶子节点连接成一个线性链表