文章中B+树插入删除部分转自:https://yq.aliyun.com/articles/9280
B+树和B-树总结:
B+ 树是B-树的变体,也是一种多路搜索树
B+树与B-树相同点在于:
1. 对于一颗M阶B+和B-树来说,根节点的分支数范围为[2,m],非根结点的分支数范围为[m/2(向上取整),m]
2. 所有叶子结点都在同一层
3. 插入操作都是在叶子结点完成(破坏结构后再向上调整)
B+ 树与B-树不同点在于:
1. B+树非叶子结点的字数指针与关键字个数相同;B-树所有结点的分支(指针)个数比关键字个数大1。(分支数都相同,关键字数B+ 树与分指数相同,B-树比分支数少1)
2. B+树非叶子结点的字数指针P[i],指向关键字值属于[k[i] , K[i+1]) 或 (k[i] , K[i+1]] 的子树(注意:B+树关键字区间是“一开一闭”);
B-树都是开区间,因为结点内的关键字都不重复,所以不会出现一个区间闭合处的关键字,所以都是开区间,例:
P[0]指向小于k[0]关键字的结点,p[1]指向大于k[0]小于k[1]关键字的结点,p[2]指向大于k[1]关键字的结点。(指针指向的结点不会包含上层关键 字)
3. B+树的所有关键字都在叶子结点出现;B-树的关键字可以在非叶子结点被找到。
4. B+树为所有叶子结点增加了一个链指针,将所有叶子结点用指针链穿起来。(稠密索引)
总结B+ 树和B- 树插入删除:
1. 都是在叶子结点进行插入,如果不破坏结构的话,直接插入;如果破坏结构,关键字多于规定时,进行结点拆分,在[m/2](向上取整)处拆分,拆分后再调整父节点到符合规定的状态
2. B+树删除都是在叶子结点进行,如果不破坏结构的话,直接删除;如果破坏结构,关键字少于规定时,先观察左右兄弟结点,若结点关键字数大于[m/2](即大于最小值),则可以借结点过来,并调整父节点到规定结构;若左右兄弟结点不可借,则进行结点合并,再修改父节点到规定结构。
B-树杀出可能在叶子结点,可以在非叶子结点,在叶子结点和B+树类似,不满足结构时需要借关键字或合并结点;在非叶子结点时,需要找到他的相邻关键字进行替换,在删除叶子节点上的相邻关键字(上一篇B-树删除操作里说过)
B+树定义及插入删除操作图