B树的图解(一看就懂)

B树

B树是一种平衡树,但是和AVL不同,B树不是二叉树,每个结点有至少两个分支。因此B树

又叫多路平衡搜索树。

对于AVL和RBT来说,自身的查找效率已经很高了,但是在具体应用时,面对海量数据,O(logn)的复杂度也会很大,树高仍然很高,因此B树作为一种可以容纳若干个关键字的数据结构,能大大减少树高,而且B树时绝对平衡的,即每一个叶子节点的高度都相同。

定义

我们定义B树是具有以下性质的数据结构:

  • 该树为空树;
  • 该树不为空树,那么定义一个m阶的B树:
    • 每个内部结点至多有m个子树,即至多含有m-1个关键字;
      • 若根节点不是终端节点,至少有两个子树;
      • 非叶子结点至少含有[m/2]-1(向上取整)个关键字;
      • 所有叶子结点的高度一致;

例如,我们可以观察一个的B树:

在这里插入图片描述

(图自CSDN博主哦吼,侵删致歉)我们可以观察到这是一棵4阶的B树,每个结点包含的关键字至少位1个,至多为3个,所有叶子节点都在同一高度上。

插入

在此之前我们要知道两个相邻子树有一个父关键字,和二叉树的父节点不同,但实际上,只是因为二叉树的每个结点只保存一个关键字导致的。

对于新增结点,我们要思考是否会破坏B树性质。

首先我们需要查找该关键字是否存在,不存在,则创建关键字插入。

  • 如果插入的结点关键字个数小于m-1,那么直接插入,因为这不会引起任何破坏。

  • 如果关键字个数不小于m-1,那么插入之后,破坏了“每个内部节点至多含有m-1个关键字”,那么我们需要进行以下操作:

    • 以该关键字序列的中间的关键字为划分,分裂为两部分,中间的关键字上升至父关键字;
  • 父节点新增结点,重复上述步骤,直到满足条件。

这样一来就保证了各项性质。

删除

对于删除,我们考虑该结点是否是叶子结点。另外删除操作可能引发关键字少于[m/2]

-1个,因此需要维护。

删除的是叶子结点的关键字

  • 第一,如果删除之后的关键字个数不小于[m/2]-1,那么直接删除;

  • 第二,如果删除之后的关键字个数少于[m/2]-1个:

    • 下沉父关键字;
    • 相邻兄弟结点的最左(右)关键字上浮成为父关键字

    这里思考一下,万一兄弟节点也不够用呢?

    我们重新讨论,将第二步的操作再细分吧。

  • 第一,如果删除之后的关键字个数不小于[m/2]-1,那么直接删除;

  • 第二,如果删除之后的关键字个数少于[m/2]-1个:

    • 当相邻兄弟关键字个数大于[m/2]-1个:
      • 如果左兄弟关键字够用,将和左兄弟的父关键字下沉,左兄弟的最右关键字上浮;
      • 如果右兄弟关键字够用,将和右兄弟的父关键字上浮,右兄弟的最左关键字上浮;
      • 都够用随便用;
    • 当相邻兄弟关键字个数都小于[m/2]-1个:
      • 和左兄弟合并,俩个兄弟的父关键字下沉。由于相邻兄弟的关键字都不足,那么我们可以想到,兄弟此时关键字为[m/2]-1,自身也是[m/2]-1(不然不会进行不够用的讨论),合起来的关键字数为m-2(或者m-1,因为这是向上取整符号)个,合并之后,父关键字需要下沉,删除需要删除的关键字。此时关键字数量为m-2,满足至多为m-1个关键字。
      • 和右兄弟同理。
  • 这时父节点的关键字减少1,如果少于[m/2]-1个:

    • 双亲是根节点,删除根节点,将合并后的新节点成为根;
    • 双亲不是根节点,重复步骤,直到满足性质或者到达根节点。

这里我们讨论是一种

删除12

假设这是一棵5阶的B树的一部分,这里我们删除12,需要向兄弟借用一个关键字,23下沉,25上浮

25下沉,25上浮

假设这是一个5阶子树的一部分,这里删除40,左右兄弟都不够用,那么合并左兄弟和本结点,36作为两兄弟的父关键字下沉,这里父节点缺失一个关键字后满足B树性质,不需要再重复步骤。

删除40

36下沉

删除的不是叶子结点的关键字

将该关键字的直接前驱(左子树的最右)或者直接后继(右子树的最左)上浮,此时删除的问题相当于交给了子树,子树的关键字上浮导致子树的关键字减一,那么进行删除的是叶子结点的关键字的步骤,将问题转换为第一种情况。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值