B树(B-树)插入、删除操作
2017-12-01 12:24
239 查看
一、定义
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[]为结点内的关键字数组),则查找成功;
三、插入
以一个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,则依次类推。
相关文章推荐
- 单链表的插入和删除操作
- 笔试题:创建一个单链表,结点包含学生的学号,姓名,性别,年龄信息.写几个程序,实现按学生学号插入,查询,删除等操作.
- 结构之美:线性表的查找、插入与删除操作
- 2016年12月23日学习总结----双向循环链表操作程序(头插、尾插、中间插入、删除)
- 数据结构——树(8)——二叉搜索树的插入和删除操作
- 线性表的基本操作:插入、删除、查找等操作在顺序存储结构和链接存储结构上的算法
- 常见算法:C语言中链表的操作(创建,插入,删除,输出)
- 实现函数功能对数组元素进行插入、删除、查询操作
- MongoDB数据库插入、更新和删除操作详解
- 利用触发器对某个表的操作过程(删除、修改、插入)
- 4. mongodb插入,修改,删除操作
- c++ 实现结构体单链表的 创建 插入 删除等操作
- Mybatis 插入和删除批处理操作
- B树的插入、删除操作
- (C语言版)链表(一)——实现单向链表创建、插入、删除等简单操作(包含个人理解说明及注释,新手跟着写代码)
- 单链表的建立(头部延长、尾部延长)、插入操作、删除操作(无头结点的删除、有头结点的删除)
- 数据结构线性表之顺序表的基本操作插入、删除、遍历、初始化
- 单向链表的相关操作(创建,遍历,插入,删除,逆置)
- 构建执行插入、更新和删除操作的Web应用程序(上)
- 跳表(Skip List)的介绍以及查找插入删除等操作