B树(又称B-树)插入、删除操作

一、定义

B树是一种平衡的多分树,通常我们说m阶的B树,它必须满足如下条件:
(1)每个结点至多有m个子结点;
(2)除根结点和叶结点外,其它每个结点至少有ceil(m/2)个子结点;
(3)根结点至少有两个子结点;(唯一例外的是根结点就是叶子结点)
(4)所有的叶结点在同一层;
(5)有k个子结点的非根结点恰好包含k-1个关键码,关键码按照递增次序进行排列。

ceil代表向上取整

二、查找

B-树的查找很简单,是二叉排序树的扩展,二叉排序树是二路查找,B-树是多路查找,因为B-树结点内的关键字是有序的,在结点内进行查找时除了顺序查找外,还可以用折半查找来提升效率。B-树的具体查找步骤如下(假设查找的关键字为key):

(1)先让key与根结点中的关键字比较,如果key等于k[i](k[]为结点内的关键字数组),则查找成功;
(2)若key小于k[1],则到p[0]所指示的子树中进行继续查找(p[]为结点内的指针数组),这里要注意B树中每个结点的内部结构;
(3)若key大于k[n],则道p[n]所指示的子树中继续查找;
(4)若k[i]大于key小于k[i+1],则沿着指针p[I]所指示的子树继续查找;
(5)如果最后遇到空指针,则证明查找不成功。

三、插入

以一个3阶的B树为例:

(1)如果该结点的关键字个数没有到达2个,那么直接插入即可;
(2)如果该结点的关键字个数已经到达了2个,那么根据B树的性质显然无法满足,需要将其进行分裂

分裂的规则是该结点分成两半,将中间的关键字进行提升,加入到父亲结点中,但是这又可能存在父亲结点也满员的情况,则不得不向上进行回溯,甚至是要对根结点进行分裂,那么整棵树都加了一层。

例1——————————————

《B树(又称B-树)插入、删除操作》

例2——————————————-

《B树(又称B-树)插入、删除操作》

《B树(又称B-树)插入、删除操作》

《B树(又称B-树)插入、删除操作》

四、删除

首先需要明确一点:删除非叶子结点必然会导致不满足B树性质

那么可以这样处理:被删关键字为该结点中第i个关键字key[i],则可从指针son[i]所指的子树中找出最小关键字Y,代替key[i]的位置,然后在叶结点中删去Y。 因此,把在非叶结点删除关键字k的问题就变成了删除叶子结点中的关键字的问题了,

那么B树的删除操作就变成了删除叶子结点中的关键字问题了。

(1)被删关键字Ki所在结点的关键字数目不小于ceil(m/2),则只需从结点中删除Ki和相应指针Ai,树的其它部分不变

《B树(又称B-树)插入、删除操作》

(2)被删关键字Ki所在结点的关键字数目等于ceil(m/2)-1,则需调整。
《B树(又称B-树)插入、删除操作》

(3)被删关键字Ki所在结点和其相邻兄弟结点中的的关键字数目均等于ceil(m/2)-1,假设该结点有右兄弟,且其右兄弟结点地址由其双亲结点指针Ai所指。则在删除关键字之后,它所在结点的剩余关键字和指针,加上双亲结点中的关键字Ki一起,合并到Ai所指兄弟结点中(若无右兄弟,则合并到左兄弟结点中)。如果因此使双亲结点中的关键字数目少于ceil(m/2)-1,则依次类推。

《B树(又称B-树)插入、删除操作》

《B树(又称B-树)插入、删除操作》

《B树(又称B-树)插入、删除操作》

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