摘要

B 树是一种平衡的多路搜索树,在添加、删除和搜索等一些操作上和二叉搜索树是同样的逻辑,除此之外 4 阶 B 树在结构上和红黑树也是相似的。所以了解 B 树,可以更好的切入学习红黑树。

红黑树是自平衡树之一,在数据结构中有比较重要的地位。同时也是入手学习比较复杂的一种结构。所以在学习红黑树之前,先学习 B 树,当作铺垫。那么为什么 B 树可以作为学习红黑树的铺垫呢?

先说结论,红黑树和 4 阶 B 树在结构上是大致一样的,所以学习完 B 树可以更好的理解红黑树。下面开始学习 B 树。

B 树

B 树是一种平衡的多路搜索树,比较多的应用到文件系统、数据库场景。B 树中的一个节点可以存放超过 2 个元素,并且可以有超过 2 个子节点。这么看来似乎超出二叉树的范畴,为什么要搞出这样的树结构?

因为 B 树也是符合二叉搜索树的一些性质,而且每个节点的所有子树高度是一致的,也就是平衡的,可以存储多个元素,有多个子节点情况,会让 B 树高度变小一些。

B 树结构中的元素符合二叉搜索树结构排序,即当前节点的元素大于左子树所有节点的元素,小于右子树所有节点的元素。

m 阶 B 树性质(m ≥\geq≥ 2)

m 通俗讲就是每个节点最大可以有多少个子节点。这里要特别说明,B 树中的每个节点可以有多个元素,不是一个节点只有一个元素

如果一个节点可以存储的元素个数为 x,那么(以 4 阶 B 树为例):

m 阶 B 树性质(m ≥\geq≥ 2) 4 阶 B 树
根节点的元素个数为:1 ≤\leq≤ x ≤\leq≤ m - 1 根节点元素个数是 1~ 3 个
非根节点的元素个数为:m / 2(向下取整) -1 ≤\leq≤ x ≤\leq≤ m - 1 非根节点的元素个数是 1~3 个
若有子节点,子节点的个数 y = x + 1 子节点的个数就是元素个数 x - 1 个
根节点若有子节点,子节点的个数就是 2 ≤\leq≤ y ≤\leq≤ m 根节点的子节点个数就是 2~4 个

B 树与二叉搜索树

B 树二叉搜索树在逻辑上是等价的。二叉搜索树从最底层叶子节点向上合并成为超级节点(超过 2 个元素的节点)。如下图所示:

B 树的操作

搜索同二叉搜索树一样,从根节点开始比较,相等就命中结束,不相等就根据比较节点元素的大小到对应的子树中比较。

添加元素是添加到叶子节点,添加完成之后就要判断节点上的元素数量是否超过个数限制(m / 2(向下取整) ≤\leq≤ x ≤\leq≤ m - 1),若超出则称为上溢

解决上溢的大致步骤就是:

  1. 将该节点的中间元素向上合并,元素个数为单数,就取中间元素,若为双数,就取中间的两个元素中的随意一个。

  2. 将该节点的剩余元素拆分为两个子节点

  3. 当节点合并到父节点时,就要判断合并后的父节点是否存在上溢,若存在,就返回步骤 1 往下继续操作。若不存在,结束。

删除元素要考虑的情况比较多,最简单的情况就是删除的元素在叶子节点,这种情况就直接删除该元素就好。

删除的元素不是在叶子节点,则需要找到该元素节点的前驱或者后继,作替换之后再处理(同二叉搜索树操作一样)。当出现删除元素之后,节点中元素个数不满足 m / 2(向下取整) -1 ≤\leq≤ x ≤\leq≤ m - 1 的时候,称为下溢情况。

当出现下溢情况时,大致的处理步骤是:

  1. 看节点的兄弟节点是否移除一个之后,兄弟节点的元素个数是否满足 m / 2(向下取整) -1 ≤\leq≤ x ≤\leq≤ m - 1 ,若满足就借过来,合并到父节点,父节点中拿出一个元素给到当前节点(要依然满足二叉搜索树的性质)
  2. 若不满足 m / 2(向下取整) -1 ≤\leq≤ x ≤\leq≤ m - 1,就需要把父节点中的元素拿出来和左右子节点合并。然后需要再判断父节点是否有下溢情况,若存在,返回步骤 1,若不存在,结束。

4 阶 B 树

4 阶 B 树在结构上和红黑树是很相似的。4 阶 B 树 所有节点能存储的元素个数 x,1 ≤\leq≤ x ≤\leq≤ 3。所有非叶子节点的子节点个数 y,2 ≤\leq≤ x ≤\leq≤ 4。

了解 4 阶 B 树,学习红黑树会更好切入。这里也是为学习红黑树做准备。

数据结构与算法-基础(十二)B 树相关推荐

  1. 12_JavaScript数据结构与算法(十二)二叉树

    JavaScript 数据结构与算法(十二)二叉树 二叉树 二叉树的概念 如果树中的每一个节点最多只能由两个子节点,这样的树就称为二叉树: 二叉树的组成 二叉树可以为空,也就是没有节点: 若二叉树不为 ...

  2. Android版数据结构与算法汇总十二章

    Android版数据结构与算法(一):基础简介 https://www.cnblogs.com/leipDao/p/9140726.html Android版数据结构与算法(二):基于数组的实现Arr ...

  3. 数据结构和算法基础(4)——树

    一.概念 1. 为什么需要树这种数据结构 ① 数组存储方式 优点:通过下标方式访问元素,速度快.对于有序数组可以通过二分查找提高检测速度. 缺点:如果要通过内容来查找元素的位置,或者插入删除值时,效率 ...

  4. 数据结构与算法(十二)并查集(Union Find)及时间复杂度分析

    本文主要包括以下内容: 并查集的概念 并查集的操作 并查集的实现和优化 Quick Find Quick Union 基于size的优化 基于rank的优化 路径压缩优化 并查集的时间复杂度 并查集的 ...

  5. 【数据结构与算法基础】二叉搜索树和平衡二叉树

    写在前面 今天学习在排序和查找中都很有用的特殊二叉树,平衡二叉树和搜索二叉树. 相关代码实现已上传至Github:data_structure/Tree/ 1.二叉搜索树(Binary Search ...

  6. java数据结构与算法基础(二)-排序

    八种常见的排序算法 八种算法分为五大类 1. 交换排序 冒泡排序 快速排序 2. 插入排序 直接插入排序 希尔排序 3. 选择排序 简单选择排序 堆排序 5. 归并排序 6. 基数排序 1. 冒泡排序 ...

  7. 【数据结构与算法基础】哈夫曼树与哈夫曼编码(C++)

    前言 数据结构,一门数据处理的艺术,精巧的结构在一个又一个算法下发挥着他们无与伦比的高效和精密之美,在为信息技术打下坚实地基的同时,也令无数开发者和探索者为之着迷. 也因如此,它作为博主大二上学期最重 ...

  8. 【数据结构与算法基础】树与二叉树的互化

    前言 数据结构,一门数据处理的艺术,精巧的结构在一个又一个算法下发挥着他们无与伦比的高效和精密之美,在为信息技术打下坚实地基的同时,也令无数开发者和探索者为之着迷. 也因如此,它作为博主大二上学期最重 ...

  9. 10_JavaScript数据结构与算法(十)哈希表

    JavaScript 数据结构与算法(十)哈希表 认识哈希表 哈希表是一种非常重要的数据结构,几乎所有的编程语言都直接或者间接应用这种数据结构. 哈希表通常是基于数组实现的,但是相对于数组,它存在更多 ...

  10. 我的软考之路(四)——数据结构与算法(2)之树与二叉树

    上篇博文主要介绍的是数据结构的线性结构,我们这篇博文介绍非线性结构-树与二叉树,我先介绍树的一些基本概念,树的遍历,再介绍二叉树相关概念和特性,以及二叉树的遍历,最后再树与二叉树的对比,总结. 树为了 ...

最新文章

  1. 13.19. File system test
  2. struts2教程(3)--请求参数处理
  3. 【GDC 21】《对马岛之魂》战斗系统讲解
  4. 转载--【笔记】Asp.Net构架(Http请求处理流程)
  5. Entity Framework 批量插入
  6. Bash数组操作教程
  7. apache配置多https域名对应单个证书和多个不同的https域名对应多个不同的证书
  8. python和c混编_python与C、C++混编的四种方式(小结)
  9. 计算机网路网络层之IP协议(3)——IP编址
  10. EDA课程设计代码汇总(信号发生器、抢答器、频率计、秒表、密码锁、计算器、VGA、PS2)
  11. 【每日早报】2019/08/19
  12. Android kotlin和java反编译后的smali 有什么区别?
  13. Phalcon框架的访问控制列表 ACL(Access Control Lists ACL)
  14. java word 批注_Java 添加Word批注(文本、图片)
  15. 【语音识别】作业1:语音特征提取
  16. PLC模拟量输入 模拟量转换FC S_ITR (CODESYS平台)
  17. 最小二乘擬合matlab,存在已知协方差情况下的最小二乘解
  18. 揭秘肖特基二极管与电源流串联的反应
  19. C++中const的作用(至少要说出3个)
  20. 《交互式程序设计 第2版》一第1章

热门文章

  1. Gunicorn-配置详解
  2. Proximal Policy Optimization Algorithms翻译
  3. libvirt介绍和使用
  4. DOTween的使用
  5. OFD电子证照模版制作工具 --(采用wpf开发)
  6. 为什么html浮动高度不一样,css浮动导致的高度塌陷问题及清楚浮动的方法
  7. Qt:Qt Widgets
  8. python requests常见用法总结
  9. C语言输出不能被3整除
  10. 动圈话筒,电容话筒,驻极体话筒的区别