B树(又称B-树)插入、删除操作
2017-12-28 15:15
295 查看
一、定义
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
,则道p
所指示的子树中继续查找;
(4)若k[i]大于key小于k[i+1],则沿着指针p[I]所指示的子树继续查找;
(5)如果最后遇到空指针,则证明查找不成功。
三、插入
以一个3阶的B树为例:(1)如果该结点的关键字个数没有到达2个,那么直接插入即可;
(2)如果该结点的关键字个数已经到达了2个,那么根据B树的性质显然无法满足,需要将其进行分裂
分裂的规则是该结点分成两半,将中间的关键字进行提升,加入到父亲结点中,但是这又可能存在父亲结点也满员的情况,则不得不向上进行回溯,甚至是要对根结点进行分裂,那么整棵树都加了一层。
例1——————————————
例2——————————————-
四、删除
首先需要明确一点:删除非叶子结点必然会导致不满足B树性质那么可以这样处理:被删关键字为该结点中第i个关键字key[i],则可从指针son[i]所指的子树中找出最小关键字Y,代替key[i]的位置,然后在叶结点中删去Y。 因此,把在非叶结点删除关键字k的问题就变成了删除叶子结点中的关键字的问题了,
那么B树的删除操作就变成了删除叶子结点中的关键字问题了。
(1)被删关键字Ki所在结点的关键字数目不小于ceil(m/2),则只需从结点中删除Ki和相应指针Ai,树的其它部分不变
(2)被删关键字Ki所在结点的关键字数目等于ceil(m/2)-1,则需调整。
(3)被删关键字Ki所在结点和其相邻兄弟结点中的的关键字数目均等于ceil(m/2)-1,假设该结点有右兄弟,且其右兄弟结点地址由其双亲结点指针Ai所指。则在删除关键字之后,它所在结点的剩余关键字和指针,加上双亲结点中的关键字Ki一起,合并到Ai所指兄弟结点中(若无右兄弟,则合并到左兄弟结点中)。如果因此使双亲结点中的关键字数目少于ceil(m/2)-1,则依次类推。
相关文章推荐
- B树插入删除操作
- B树的插入、删除操作
- 线性表的基本操作:新建,插入,删除,查找(C语言版)
- jQuery:节点(插入,复制,替换,删除)操作
- 数据结构与算法分析之顺序存储结构的建立,插入和删除操作
- 数据结构基础5.2:二叉搜索树(BST)的基本操作(插入、查找、删除)
- Searsar之更新,删除,插入操作的方法命名-yellowcong
- 三种DML操作:插入数据,更新数据,删除数据.
- 手机联系人的相关操作,删除,插入,更新
- 单链表的创建、插入、删除、倒置操作
- 单链表的创建、计数打印、删除与插入操作
- 实现函数功能对数组元素进行插入、删除、查询操作
- 算法导论第三版-第6章堆排序操作完整代码(建堆、插入、删除、排序等)
- 链表的基本操作(创建,查找指定位置元素,删除指定元素,插入,倒置,去重,求集合的差,分别交换结点与交换结点值实现的冒泡排序,将两个有序链表合并成一个有序链表)c语言实现
- 触发器记录表某一个字段数据变化的日志 包括插入insert 修改update 删除delete 操作
- Hdu 5812 Distance(三种操作. 1.插入x 2.删除x 3.在集合中找到一个数y,使得y->x,每次能除以一个素数或者乘上一个素数,问最少的操作次数)
- 链表建立、删除、插入基本操作
- 实现StringGrid的删除,插入,排序行操作(基本操作啦)
- JS 字符串操作函数 往指定位置插入字符 删除指定位置字符 替换指定位置字符
- 顺序表的各种操作(建立,查找,删除,插入等)