图解B+树并和B-树特点对比总结

文章中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+树定义及插入删除操作图解:(转)

一,    M阶B+树的定义(M阶是指一个节点最多能拥有的孩子数,M>2):

《图解B+树并和B-树特点对比总结》

图1.1 3阶B+树

        (1)根结点只有1个,分支数量范围[2,m]。

        (2)除根以外的非叶子结点,每个结点包含分支数范围[[m/2],m],其中[m/2]表示取大于m/2的最小整数。

        (3)所有非叶子节点的关键字数目等于它的分支数量。

        (4) 所有叶子节点都在同一层,且关键字数目范围是[[m/2],m],其中[m/2]表示取大于m/2的最小整数。

        (5)所有非叶子节点的关键字可以看成是索引部分,这些索引等于其子树(根结点)中的最大(或最小)关键字。例如一个非叶子节点包含信息: (n,A0,K0, A1,K1,……,Kn,An),其中Ki为关键字,Ai为指向子树根结点的指针,n表示关键字个数。即Ai所指子树中的关键字均小于或等于Ki,而Ai+1所指的关键字均大于Ki(i=1,2,……,n)。

        (6)叶子节点包含全部关键字的信息(非叶子节点只包含索引),且叶子结点中的所有关键字依照大小顺序链接(所以一个B+树通常有两个头指针,一个是指向根节点的root,另一个是指向最小关键字的sqt)。


二,    3阶B+树的插入举例:

 

l  例1:

往下图的3阶B+树中插入关键字9

《图解B+树并和B-树特点对比总结》

首先查找9应插入的叶节点(最左下角的那一个),插入发现没有破坏B+树的性质,完毕。插完如下图所示:

《图解B+树并和B-树特点对比总结》

 

l  例2:

往下图的3阶B+树插入20

《图解B+树并和B-树特点对比总结》

首先查找20应插入的叶节点(第二个叶子节点),插入,如下图

《图解B+树并和B-树特点对比总结》

发现第二个叶子节点已经破坏了B+树的性质,则把之分解成[20 21], [37 44]两个,并把21往父节点移,如下图

《图解B+树并和B-树特点对比总结》

发现父节点也破坏了B+树的性质,则把之再分解成[15 21], [44 59]两个,并把21往其父节点移,如下图

《图解B+树并和B-树特点对比总结》

这次没有破坏B+树的性质(如果还是不满足B+树的性质,可以递归上去,直到满足为至),插入完毕。

 

l  例3:

往下图的3阶B+树插入100

《图解B+树并和B-树特点对比总结》

首先查找100应插入的叶节点(最后一个节点), 插入,如下图

《图解B+树并和B-树特点对比总结》

修改其所有父辈节点的键值为100(只有插入比当前树的最大数大的数时要做此步),如下图

《图解B+树并和B-树特点对比总结》

然后重复Eg.2的方法拆分节点,最后得

《图解B+树并和B-树特点对比总结》

三,    3阶B+树的删除举例:

 

l  例1:

删除下图3阶B+树的关键字91

《图解B+树并和B-树特点对比总结》

首先找到91所在叶节点(最后一个节点),删除之,如下图

《图解B+树并和B-树特点对比总结》

没有破坏B+树的性质,删除完毕

 

l  例2:

删除下图3阶B+树的关键字97

《图解B+树并和B-树特点对比总结》

首先找到97所在叶节点(最后一个节点),删除之,然后修改该节点的父辈的键字为91(只有删除树中最大数时要做此步),如下图

《图解B+树并和B-树特点对比总结》

 

l  例3:

删除下图3阶B+树的关键字51

《图解B+树并和B-树特点对比总结》

首先找到51所在节点(第三个节点),删除之,如下图

《图解B+树并和B-树特点对比总结》

破坏了B+树的性质,从该节点的兄弟节点(左边或右边)借节点44,并修改相应键值,判断没有破坏B+树,完毕,如下图

《图解B+树并和B-树特点对比总结》

 

l  例4:

删除下图3阶B+树的关键字59

《图解B+树并和B-树特点对比总结》

首先找到59所在叶节点(第三个节点),删除之,如下图

《图解B+树并和B-树特点对比总结》

破坏B+树性质,尝试借节点,无效(因为左兄弟节点被借也会破坏B+树性质),合并第二第三叶节点并调整键值,如下图

《图解B+树并和B-树特点对比总结》

完毕。

 

l  例5:

删除下图3阶B+树的关键字63

《图解B+树并和B-树特点对比总结》

首先找到63所在叶节点(第四个节点),删除之,如下图

《图解B+树并和B-树特点对比总结》

合并第四五叶节点并调整键值,如下图

《图解B+树并和B-树特点对比总结》

发现第二层的第二个节点不满足B+树性质,从第二层的第一个节点借59,并调整键值,如下图

《图解B+树并和B-树特点对比总结》

完毕

总结B+ 树和B- 树插入删除:

1. 都是在叶子结点进行插入,如果不破坏结构的话,直接插入;如果破坏结构,关键字多于规定时,进行结点拆分,在[m/2](向上取整)处拆分,拆分后再调整父节点到符合规定的状态

2. B+树删除都是在叶子结点进行,如果不破坏结构的话,直接删除;如果破坏结构,关键字少于规定时,先观察左右兄弟结点,若结点关键字数大于[m/2](即大于最小值),则可以借结点过来,并调整父节点到规定结构;若左右兄弟结点不可借,则进行结点合并,再修改父节点到规定结构。

  B-树杀出可能在叶子结点,可以在非叶子结点,在叶子结点和B+树类似,不满足结构时需要借关键字或合并结点;在非叶子结点时,需要找到他的相邻关键字进行替换,在删除叶子节点上的相邻关键字(上一篇B-树删除操作里说过)

    原文作者:B树
    原文地址: https://blog.csdn.net/u010842515/article/details/68924579
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞