目录

1. 数据结构树–>树基础
2. 数据结构树–>二叉树
3. 数据结构树–>二叉查找树\二叉排序树
4. 数据结构树–>平衡二叉树
5. 数据结构树–>霍夫曼树
6. 数据结构树–>红黑树
7. 数据结构树–>二叉堆
8. 数据结构树–>B树
9. 数据结构树–>B+树

B树

1. B树的定义

B 树是一颗多路不平衡树,我们描述一颗B树时需要指定它的阶数,eg: 这是一颗5阶B树,阶数表示了一个节点最多有多少孩子节点,一般用M表述。

m就是B树的阶数,当 m=2 时就是我们常见的二叉查找树。

一个m阶B树的定义如下:

  1. 每个节点最多有m-1个关键字。
  2. 根节点最少可以只有1个关键字
  3. 非根节点至少有m/2个关键字
  4. 所有叶子节点都位于同一层,或者说根节点到每个叶子节点的长度都相同。
  5. 每个节点中的关键字都按照从小到大的顺序排列,每个关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它。

下面是一个3阶B树

  1. 根节点至少有一个数据。

  2. 非根节点至少有个 m/2 个数据。(无法除尽按照代码运算,eg: 5/2=2)

  3. 节点最多有 m -1 个数据。

  4. 所有叶子节点都处于同一层。

  5. 第五条也好理解,每个节点内的数据从小到大排列,每个节点左子树小于它的最小数据,右子树大于它的最大数据,中间子树数值在两个数据之间。

    eg: 3 5 数组在父节点 2 6 之间,3 5 节点属于中间子树。

2. B树的插入

B树的插入参考文章:B树和B+树的插入、删除图文详解

B树插入操作的逻辑:

  1. 根据要插入的Key的值,找到叶子节点插入数据。

  2. 判断当前节点是否满足节点最多 m-1 个数据,满足则结束,不满足则进行第3步。

  3. 以节点中间的 key 值为中心,分裂为两个节点,中间的key值插入到父节点中,这个key的左子树指向分裂后的左半部分,右子树指向分裂后右半部分。

    然后以key值所在节点进行第 2 步的判断。

看参考文章上的举例,以5阶B树为例。

2.1 B树中插入 39 、22、97、41

  1. 找到要插入的节点(根节点), 插入元素。
  2. 节点元素从小到大排列。
  3. 节点元素个数满足 m-1 , 结束插入。

2.2 B树中再插入 53

数据插入后节点数据个数为5,超多了节点最多m-1,所以这个节点要分裂。进行插入操作的第3步。

  1. 以节点数据 41 为中间key, 分裂为两部分, 22、39 与 53、97。
  2. 节点数据41 插入到父节点,父节点没有数据,则41单独构成一个根节点。
  3. 新的根节点左子树指向 22、39构成的节点,右子树指向 53、97构成的节点,
  4. 判断父节点, 父节点数据个数小于 m-1, 则插入结束。

最后形成的B树为:

2.3 B树依次再插入13,21,40

根据插入值的大小,我们知道这3个值都会插入到上图左叶子节点中,则左叶子节点形成了, 13、21、22、39、40,的数据。

进入步骤2,判断节点超出 m-1 个数据,则左叶子节点开始分裂。

  1. 以22数据中中心,分裂为两个13、21与 39、40。 22数据插入到父节点。
  2. 新的节点 13、21作为22的左子树, 39、40作为22的右子树。
  3. 判断父节点,插入结束。

最后形成的B树为:

如上图,形成了B树的节点用有了中间子树。

2.4 节点浪费情况

看下图

我们知道当一个B树确定了它的阶数,则这棵B树节点的大小是固定的(m-1),,但在我们实际的操作中,总会有节点无法再插入,这种情况就造成了固定节点大小的节点浪费情况。

例如:节点 28、29, 由于父节点的情况我们知道,它无法再插入数据,节点后面的空间就造成了浪费。所以如果记录先按key的大小排好序,再插入到B树中,

结点的使用率就会很低,最差情况下使用率仅为50%。

3. B树的删除

B树的插入我们了解到了中间节点的上移,在B树的删除中我们将插入操作反向进行,让类似的中间节点下移,其他节点合并成一个节点。

步骤:

  1. 首先要删除数据的节点为非叶子节点,用该节点数据的后继节点数据来代替要删除数据,这个方式与二叉查找树的删除类似,找到后继节点数据(右子树最小值或左子树的最大值),然后对后继节点进行第二步判断,如果要删除的数据在叶子节点,则删除后直接进入第二步。
  2. 判断节点是否符合B树特性,特性:非根节点至少有个 m/2 个数据。满足则删除结束,否则进入第3步。
    1. 如果兄弟节点数据个数大于 m/2,则父节点数据下移到该节点,兄弟节点中一个数据(最大值或最小值)上移到原父节点位置,删除结束。
    2. 如果不是1的情况,则父节点数据下移到该节点,该节点与兄弟节点合拼,形成新的节点,新节点父节点指向原父节点中的数据。父节点数据进入步骤2进行递归操作。

我们以2.4 节点浪费情况的图为基础来研究删除的步骤。

3.1 删除21

节点数据删除后,节点任旧符合B树特性,删除结束。

3.2 删除 27

  1. 查找节点数据27的后继数据,与二叉查找树删除类似,找到数据右子树最小值,为节点数据28, 节点数据28替换要删除的节点数据27.
  2. 查看兄弟节点数据个数大于 (m/2)—>2,则父节点下移到该节点,兄弟节点是左子树,则兄弟节点最大值上移,完成删除。

删除结果:

3.3 删除32

  1. 32所在节点为叶子节点,直接删除,则该节点进入第二步判断。

  2. 该节点数据个数小于2,不满足B树特性,进入第三步判断,兄弟节点数据个数为2,满足第三步 第2条。

  3. 父节点下移,该节点与兄弟节点合并,形成新的节点,将新节点的父节点指向原父节点数据的前一个数据。父节点变为当前节点进行判断。

  4. 父节点满足B树特性,删除结束。

3.4 删除40

删除40的操作和删除32的操作是一样的,这里不一样的一点是我们可以选择左兄弟节点也可以选择右兄弟节点,都可以达到删除的目的。

删除结果:

数据结构树-->B树相关推荐

  1. 安卓如何实现多级结构树_数据结构-树(树基本实现C++)

    ​树形结构是一种重要的非线性数据结构.其中树和二叉树最为常用,直观看来树是以分支关系定义的层次结构.树形结构是我们平时比较熟悉的,比如文件夹目录.公司组织关系等.在计算机领域也得到广泛的应用,编译程序 ...

  2. DF学数据结构系列——B树(B-树和B+树)介绍

    B树 定义:一棵B树T是具有如下性质的有根树: 1)每个节点X有以下域: a)n[x],当前存储在X节点中的关键字数, b)n[x]个关键字本身,以非降序存放,因此key1[x]<=key2[x ...

  3. 数据结构和算法分析:B树 B+树 和B*树的总结

    1. 前言 动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree),红黑树(Red-Black Tree ),B ...

  4. Python__数据结构与算法——树、二叉树(实现先、中、后序遍历)

    目录 一.树 二.二叉树 树和前面所讲的表.堆栈和队列等这些线性数据结构不同,树不是线性的.在处理较多数据时,使用线性结构较慢,而使用树结构则可以提高处理速度.不过,相对于线性的表.堆栈和队列等线性数 ...

  5. 307. Range Sum Query - Mutable | 307. 区域和检索 - 数组可修改(数据结构:线段树,图文详解)

    题目 https://leetcode.com/problems/range-sum-query-mutable/ 吐槽官方题解 这题的 英文版官方题解,配图和代码不一致,而且描述不清:力扣国内版题解 ...

  6. 数据结构之基环树——骑士,Island,旅行加强版,Number of Simple Paths,Traffic Network in Numazu,Card Game

    文章目录 [ZJOI2008]骑士 [IOI2008] Island [NOIP2018 提高组] 旅行 加强版 CF1454E Number of Simple Paths Traffic Netw ...

  7. 数据结构八-Trie树

    文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 1 Trie树的使用场景 搜索引擎中的搜索词建议.当你在搜索引擎中输入词,搜索引擎提示给你一个词的列表, ...

  8. 数据结构之树:树的介绍——9

    数据结构之树,介绍篇 树的基本定义 介绍:树(tree)是计算机中非常重要的数据结构,它的外形看起来像一颗倒挂着的的树,使用树这种结构可以描述生活中很多的事物,如族谱,单位的组织架构,xml,html ...

  9. NOI数据结构:后缀树

    NOI数据结构:后缀树 后缀树_fanzitao的专栏-CSDN博客_后缀树 后缀树 - sangmado - 博客园 字符串-后缀树和后缀数组详解 字符串-后缀树和后缀数组详解_吴泽龙的博客-CSD ...

  10. 数据结构:树套树-替罪羊树套权值线段树

    BZOJ3065 本题是在BZOJ上的处女A,实在不应该拿这样一道题来开头 平衡树套线段树应该是树套树问题里比较难的一种了,当然我记得还有一个替罪羊树套Trie树的题,我是不信自己能写出来的. 外层的 ...

最新文章

  1. java使用HttpClient传输json格式的参数
  2. struts2几种result type探究
  3. .net持续集成测试篇之Nunit文件断言、字符串断言及集合断言
  4. 各种损失损失函数的使用场景和使用方法:KL散度
  5. 下班理财超过上班赚钱
  6. 计划doing.....
  7. [二分][贪心]JZOJ P3996 Sabotage
  8. 计算机软件著作权登记怎么填写,计算机软件著作权登记申请表填写说明
  9. 项目背景一般写什么_项目申报整体框架规划思路,提高你的书写逻辑!
  10. lqr控制和模糊控制三级倒立摆
  11. WPS简历模板的图标怎么修改_个人简历怎么做?个人求职简历模板
  12. -webkit-内核兼容处理
  13. Windows下利用Chrome调试IOS设备页面
  14. 给自己的网站添加在线客服代码
  15. 苹果xsmax怎么开机_粉丝水洗苹果XS MAX手机不开机,Face ID报废,你还这么做吗?...
  16. MySQL对数据表进行分组查询(GROUP BY)
  17. 视频添加图片背景怎么操作
  18. 简易爬虫--360图片爬取
  19. 调用现有word简历模板,使用docxtpl填写简历
  20. Sparrow——数据库脚本

热门文章

  1. wepy 父调用子组件方法_微信小程序wepy框架笔记小结
  2. SQL试题以及答案(仅供参考)
  3. 做Tik Tok CPA CPS 月入5w 我踩过哪些坑?
  4. 得墨忒耳定律(Law of Demeter)
  5. computed用发_Vue的Computed的使用
  6. 合并两个list 并去重
  7. linux系统引导与修复过程
  8. 同济大学C++moooc第一讲和第二讲答案
  9. python:pprint --- 数据美化输出
  10. html5如何利用rem实现自适应布局,使用Rem布局实现自适应