B树和B+树总结

1. B树定义

解析:B树是一种平衡的多路查找树,一棵m阶的B树,或为空树,或为满足下列特性的m叉树,如下所示:

(1)树中每个结点至多有m棵子树;

(2)若根结点不是叶子结点,则至少有两颗子树;

(3)除根之外的所有非终端结点至少有《B树和B+树总结》颗子树;

(4)所有的非终端结点中包含下列信息数据《B树和B+树总结》

其中,《B树和B+树总结》为关键字,且《B树和B+树总结》为指向子树根结点指针,且指针《B树和B+树总结》

所指子树中所有结点关键字均小于《B树和B+树总结》所指子树中所有结点关键字均大于《B树和B+树总结》

为关键字的个数(或n+1为子树个数)。

(5)所有的叶子结点都出现在同一层次上,并且不带信息(可以看作是外部结点或查找失败的结点,实际上这些结点不存在,指向这些结点的指针为空)。

说明:结点最大的孩子数目称为B树的阶。2-3树和2-3-4树都是B树的特例。2-3树是3阶B树,2-3-4树是4阶B树。

 

2. B树插入

解析:

(1)一棵2-3树

《B树和B+树总结》

(2)插入30之后

《B树和B+树总结》

(3)插入26之后

《B树和B+树总结》

(4)插入85之后

《B树和B+树总结》

《B树和B+树总结》

(5)插入7之后

《B树和B+树总结》

 

3. B树查找

解析:在B树上进行查找的过程是一个顺指针查找结点和在结点的关键字中进行查找交叉进行的过程。

 

4. B树删除

解析:若在B-树上删除一个关键字,则首先应找到该关键字所在结点,并从中删除之,若该结点为最下层的非终端结点,且其中的关键字数目不少于ceil(m/2),则删除完成,否则要进行“合并”结点的操作。假若所删关键字为非终端结点中的《B树和B+树总结》,则可以指针《B树和B+树总结》所指子树中的最小关键字Y替代《B树和B+树总结》,然后在相应的结点中删去Y。在B树上删去45,可以*f结点中的50替代45,然后在*f结点中删去50。如下所示:

《B树和B+树总结》

删除最下层非终端结点中的关键字有三种情形,如下所示:

(1)被删关键字所在结点中的关键字数目不小于ceil(m/2),则只需从该结点中删去该关键字《B树和B+树总结》和相应指针《B树和B+树总结》,树的其它部分不变。在B树中删去关键字12,删除后的B-树如下所示:

《B树和B+树总结》

(2)被删关键字所在结点中的关键字数目等于ceil(m/2)-1,而与该结点相邻的右兄弟(或左兄弟)结点中的关键字数目大于ceil(m/2)-1,则需将其兄弟结点中的最小(或最大)的关键字上移至双亲结点中,而将双亲结点中小于(或大于)且紧靠该上移关键字的关键字下移至被删关键字所在结点中。在B树中删去50,需将其右兄弟结点中的61上移至*e结点中,而将*e结点中的53移至*f,从而使*f和*g中关键字数目均不小于ceil(m-1)-1,而双亲结点中的关键字数目不变。删除后的B-树如下所示:

《B树和B+树总结》

(3)被删关键字所在结点和其相邻的兄弟结点中的关键字数目均等于ceil(m/2)-1。假设该结点有右兄弟,且其右兄弟结点地址由双亲结点中的指针《B树和B+树总结》所指,则在删去关键字之后,它所在结点中剩余的关键字和指针,加上双亲结点中的关键字《B树和B+树总结》一起,合并到《B树和B+树总结》所指兄弟结点中(若没有右兄弟,则合并至左兄弟结点中)。在B树中删去53,则应删去*f结点,并将*f中的剩余信息(指针“空”)和双亲*e结点中的 61一起合并到右兄弟结点*g中。删除后的B-树如下所示:

《B树和B+树总结》

如果因此使双亲结点中的关键字数目小于ceil(m/2)-1,则依次类推。在B-树中删去关键字37之后,双亲b结点中剩余信息(“指针c”)应和其双亲*a结点中关键字45一起合并至右兄弟结点*e中,删除后的B-树如下所示:

《B树和B+树总结》

 

5. B+树定义

解析:B+树是B树的变形树。一棵m阶的B+树和m阶的B树的差异,如下所示:

(1)有n棵子树的结点中含有n个关键字;

(2)所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。

(3)所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字。

说明:通常在B+树上有两个头指针,一个指向根节点,另一个指向关键字最小的叶子节点。因此可以对B+树进行两种查找运算:一种是从最小关键字起顺序查找,另一种是从根节点开始,进行随机查找。在B+树上进行随机查找、插入和删除的过程基本上与B树类似。只是在查找时,若非终端结点上的关键字等于给定值,并不终止,而是继续向下直到叶子结点。因此,在B+树中,不管查找成功与否,每次查找都是走了一条从根到叶子结点的路径。

 

参考文献:

[1] 数据结构[C语言版]

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