B树

2021-01-14  本文已影响0人  code希必地

1、概述

B树是一种平衡的多路搜索树,多用于文件系统、数据库的实现。

3阶B树.png
4阶B树.png
5阶B树.png
B树的特点:

2、m阶B树的性质(m>=2)

2.1、元素个数和子节点个数

3、B树 VS 二叉搜索树

4、搜索

B树的搜索和二叉搜索树的搜索类似。


image.png

4、添加

和40比较,大于40,然后和右子树节点元素比较,小于60,则和其左子元素进行比较,大于50,将元素插入到50的右边。结果如下图

image.png
示例二:插入95,过程同上,直接上图
image.png
示例三:插入98
image.png
如果这是一颗4阶B树的话,在插入98之后,右下角的节点的元素个数等于4,不满足ceil(m/2)-1<= x <= m-1,这种情况称为上溢

添加导致上溢的解决

下图为5阶B树的一部分


image.png
  • 将k位置的元素向上与父节点合并。
  • 将上溢节点[0,k-1][k+1,m-1]分成两个子节点。作为k位置元素的左右子节点。(不用担心这两个子节点的个数小于ceil(m/2)-1)。

分裂完成图如下:


image.png
  • 取出上溢根节点中间元素40,将其作为新的根节点,假设位置为k
  • 将[0,k-1]、[k=1,m-1]分裂成2个字节点,作为根节点的左右子节点

结果如下图


image.png

添加练习

下图是一个4阶B树


image.png

5、删除节点

5.1、删除叶子节点

如果删除的是叶子节点,那么直接删除即可。


image.png

比如删除30


image.png

5.2、删除非叶子节点

  1. 先找到前驱或后继元素,覆盖所要删除的元素。
  2. 再把前驱或后继元素删除。


    image.png

    比如删除60

找前驱节点和二叉树相同,node.left.right.right.....
60的前驱元素为55,用55覆盖60
由于55是在叶子节点中,直接删除即可

image.png
非叶子节点的前驱元素或后继元素,一定在叶子节点中。注意是非叶子节点的前驱或后继
所以删除非叶子节点,最终要删除的元素依然在叶子节点中。

5.3、删除导致的下溢

看下图中的5阶B树

image.png
删除元素22。
叶子节点中元素删除可能会导致节点中的元素个数小于ceil(m/2)-1,这种情况就称为下溢

5.4、下溢的解决

旋转操作

  • 将父节点中的b元素插入到下溢节点的0的位置,即最小位置。
    用兄弟节点的最大元素a替代父节点的元素b
    这种操作其实是**旋转 **。
    上面操作是右旋操作,所以原先a元素的右子节点d变成了b元素的左子节点。
    image.png
  • 下面看下左旋操作
    image.png
    删除左子节点元素,会下溢,将b元素插入到下溢节点的最大位置,用兄弟节点的最小元素a替代父节点元素b

合并操作

将父节点的元素b挪下来和左右子节点进行合并
合并后的元素个数=ceil(m/2)+ceil(m/2)-2,不超过m-1
这样操作可能会造成父节点下溢,依然按照上述方法解决,下溢现象可能会一直向上传播。

练习

下图是一棵5阶B树

image.png
删除元素22
  1. 叶子节点元素个数为1,小于ceil(m/2)-1。
    2.由于临近兄弟节点的元素个数ceil(m/2)-1,所以不能从兄弟节点中接元素。只能将父节点中的元素20挪下来和其左右子节点合并成一个节点。
    3.挪下来之后发现父节点元素个数小于ceil(m/2)-1。则需要将根节点30挪下来和其左右子节点进行合并。
image.png

6、4阶B树

学习4阶B树是为了更好的理解红黑树,这也是本文的目的。
4阶B树的性质:

6.1、添加

元素从1添加到22,组成一个4阶B树。

6.2、删除

从1删除到22

上一篇 下一篇

猜你喜欢

热点阅读