1 简介

可以用阶数来描述B树, 一棵M阶B树代表着该B树最多有M个孩子节点. 如果M为2, 那么该B树就是一棵二叉搜索树. 一棵M阶B树具有以下性质:

1. 每个节点最多有M - 1个关键字. 跟普通的树不同, B树的关键字有多个.

2. 根节点最少可以只有一个关键字.

3. 非根节点至少有k个关键字, 这里的k是指ceil(M / 2) - 1.(这里面的ceil是指大于等于参数的最小整数, 从下面插入操作分析可知, 叶子节点都是由父节点分裂而来, 而分裂的条件就是分裂前节点总数已经达到了M)

4. 每个节点中的关键字都按照从小到大的顺序排列, 每个关键字在左子树中的所有关键字都小于它本身的关键字, 右子树的都大于它本身关键字.

5. 所有叶子节点都位于同一层, 或者说根节点到每个叶子节点的长度都相同.

2 插入操作

一棵M阶树的插入操作可以总结为以下步骤:

1. 根据要插入的key的值, 找到对应的叶子节点(一定要注意是叶子节点)

2. 如果被插入后的节点的key总数达到了M, 就需要对该节点, 按照key序列的中间左右分开进行分裂, 中间的key插入其父节点.

3. 对父节点进行第二步检查.

下面以一棵5阶B树的插入操作举例:

1. 首先插入39, 22, 97, 41:

2.  插入39, 节点总key数量达到了5, 进行分裂:

3.  插入13, 21:

4. 插入40, 节点分裂, 22进入父节点:

5. 插入30, 27, 33, 其中33插入后, 该节点满, 导致其分裂, 33进入父节点:

6. 插入36, 35, 34, 其中34插入后, 该节点满, 导致节点分裂, 36进入父节点:

7. 插入24, 29:

8. 插入26, 导致该节点满, 分裂, 27 进入父节点, 然后父节点也满了, 再分裂, 创建新节点:

3 删除操作

1. 首先找到要删除的点, 如果点不在树中, 那么肯定删除失败了.

2. 如果要删除的节点位于叶子节点, 那么拿掉这个节点, 如果位于非叶子节点上, 那么就要找到其后继节点, 因为后继节点肯定位于叶子节点上(因为肯定位于最左, 如果还位于非叶上面, 因其左子节点肯定存在比其大的节点, 不可能出现这种情况), 把要删除的节点替换成后继节点的值, 然后删除后继节点.

3. 因为最终删除的点位于叶子上, 所以要观察此时该叶节点是否满足B树的性质3:

非根节点至少有k个关键字, 这里的k是指ceil(M / 2) - 1

如果满足, 那么结束删除操作, 如果不满足, 那么进行4.

4. 先观察兄弟节点的情况:

如果兄弟节点的key数量大于k, 那么把父亲节点的key下移至该节点, 并把兄弟节点的一个节点上移至父节点

否则, 将父节点中的key下移与当前节点及其兄弟节点中的key合并, 形成一个新的节点. 原父节点中的key的两个孩子指针就变成了一个孩子指针, 指向这个新节点, 然后当前节点的指针指向父节点, 重复第3步.

举例说明:

1. 原始状态5阶B树, 每个非根节点的最少关键字数量为ceil(5 / 2) - 1 = 2:

2. 删除21, 位于叶节点, 且删除完成后该节点关键字数量为2, 结束:

3. 删除27, 27位于非叶子节点上

3.1 首先把其值修改为后继节点28:

3.2 删除28, 28位于叶子节点上, 删去:

3.3 此时该节点key数量小于2, 其左边的兄弟节点有三个key, 可以把父节点一个key移下来, 把兄弟节点一个key移到父节点, 具体操作就是把28下移, 26上移, 完成:

4. 删除32

4.1 首先删除32:

4.2 该节点key数量为1, 小于2, 而兄弟节点也没有大于2的了, 所以让父节点中对应的key30下移与该节点和兄弟节点合并:

多路平衡查找树 --- B(B-)树相关推荐

  1. 多路平衡查找树(B Tree)(分裂、合并)

    Balanced Tree 这个就是我们的多路平衡查找树,叫做B Tree(B 代表平衡) 跟AVL 树一样,B 树在枝节点和叶子节点存储键值.数据地址.节点引用. 它有一个特点:分叉数(路数)永远比 ...

  2. B树-多路平衡查找树

    B树 B树 一个m阶B树的具有的特征(或必须满足的条件) B树的查找 B树插入元素(一定是在叶子节点插入) 1.插入后,没有破坏B树的规则 2.插入后,叶子节点元素超过m-1个 B树删除元素 1.删除 ...

  3. B+树(加强版多路平衡查找树)

    B Tree 的效率已经很高了,为什么MySQL 还要对B Tree 进行改良,最终使用了B+Tree 呢? 总体上来说,这个B 树的改良版本解决的问题比B Tree 更全面. 我们来看一下InnoD ...

  4. 面试官问你B树和B 树,就把这篇文章丢给他

    原文链接:面试官问你B树和B 树,就把这篇文章丢给他 在看这篇文章之前,我们回顾一下前面的几篇关于MySQL的文章,应该对你读下面的文章有所帮助. InnoDB与MyISAM等存储引擎对比 面试官问你 ...

  5. 目录树 删除 数据结构_数据结构:B树和B+树的插入、删除图文详解

    B树 1.1B树的定义 B树也称B-树,它是一颗多路平衡查找树.我们描述一颗B树时需要指定它的阶数,阶数表示了一个结点最多有多少个孩子结点,一般用字母m表示阶数.当m取2时,就是我们常见的二叉搜索树. ...

  6. 面试官问你B树和B+树,就把这篇文章丢给他

    1 B树 在介绍B+树之前, 先简单的介绍一下B树,这两种数据结构既有相似之处,也有他们的区别,最后,我们也会对比一下这两种数据结构的区别. 1.1 B树概念 B树也称B-树,它是一颗多路平衡查找树. ...

  7. B树、B+树到底是什么?

    B树.B+树到底是什么? B树 概念 B树的高度 查找 B+树 概念 区别 后续 B树 B树又称多路平衡查找树,B树中所有结点的孩子个数的最大值称为B树的阶,通常用m表示.一般从查找效率考虑,通常要求 ...

  8. 3层b+树索引访问磁盘次数_从B+树到LSM树,及LSM树在HBase中的应用

    点击上方蓝色字体,选择"设为星标" 回复"资源"获取更多资源 大数据技术与架构点击右侧关注,大数据开发领域最强公众号! 暴走大数据点击右侧关注,暴走大数据! 前 ...

  9. 【Java数据结构与算法】第十五章 B树、B+树和B*树

    第十五章 B树.B+树和B*树 文章目录 第十五章 B树.B+树和B*树 一.B树 1.引入 2.介绍 二.B+树 1.引入 2.介绍 三.B*树 1.介绍 一.B树 1.引入 为什么数据库索引要使用 ...

最新文章

  1. Fast and accurate short read alignment with Burrows-Wheeler transform
  2. Oracle 11G在用EXP 导出时,空表不能导出解决
  3. 超越IEtab、网银支付助手,无需再次登陆的Firefox的IE插件
  4. LiveVideoStackCon 北京站,好久不见
  5. Java调试器–权威的工具列表
  6. 软件测试要经过哪几个阶段?
  7. Boring Partition(CF-239D)
  8. 【入门6】函数与结构体(今天刷洛谷了嘛)
  9. 小白Linux下安装mysql
  10. 数据结构—链表-链式存储
  11. yolov 论文发表在什么期刊上_论文发表期刊发表论文研究方法
  12. PaddlePaddle(1)——让人拍案叫绝的创意都是如何诞生的
  13. 安装运行okvis odometry
  14. npm和包、npm下载安装使用包、全局安装包和本地安装包、全局安装nodemon包、开发依赖和生产依赖
  15. scratch经典游戏主题源码分享,包含了20多款经典游戏
  16. 3、查询省会(Python实现多行输入,以回车结束输入)
  17. lubuntu输入法设置_Ubuntu18输入法设置
  18. Error: for..in loops iterate over the entire prototype chain
  19. 2012年第一批中关村高端领军人才公示公告
  20. 图解|什么是缓存系统三座大山

热门文章

  1. 向量归一化的matlab程序,向量X的归一化及其Matlab简单示例
  2. halocn标定找旋转中心_机器人工具坐标系标定原理
  3. matlab 小波中心频率,小波频域特性Matlab实现.pdf
  4. python预测发展趋势_Python中的趋势“预测器”?
  5. LaTeX引用多篇bibtex格式文献
  6. Python编程从入门到实践~if语句
  7. Replace Type Code with Class(以类取代类型码)
  8. session过期时间控制的一些常用方法
  9. linux汇编字符长怎么看,linux – 在内联GNU汇编程序中获取字符串长...
  10. python excel行数计算不对_数十万数据Excel数据不好处理怎么办?几行Python搞定