数据结构与算法---B-Tree

手撕B-Tree

注意不是“B减Tree”,而是“B杠Tree”,B-Tree就是B树,没有所谓的B减树!!!

B树是一种平衡多叉排序树,这里指的平衡是指所有叶节点都在同一层上,从而避免出现像二叉排序树那样的分支退化现象;多叉是指多于二叉,因此B树是一种动态查找效率较二叉排序树更高的树结构。

如图所示:
在这里插入图片描述
探讨B树之前,我们先了解关于B树的一些概念:

  • B树的 :就是B树中每个结点最多子节点个数,例如2-3树的阶是 3 ,2-3-4树的阶是 4 ;(下面会以2-3树来讲解)
  • B-树的 关键字 :结点当中存贮的key,上图中9,2,6,11这些都是关键字;一颗N阶B-树,其除根节点外,每个结点的关键字个数都满足(m/2)-1<=N<=m-1,(m/2)向上取整。例如2-3树除根结点外其余结点的关键字个数满足1<=N<=2;例如2-3-4树除根结点外其余结点的关键字个数满足1<=N<=3;

B-Tree的特性:
我们设B树的阶用N表示(为了查找效率 N>2 ,且在后面N也表示B树的阶)。
一颗N阶的B-树或者是空树或者是满足如下几个要求的B-树:

  • 每个结点至多有N个结点;
  • 除根结点以外,每个结点至少有m/2(向上取整)个字结点;
  • 每个结点的结构为:一个保存当前结点关键字个数的变量,一个存储所有关键字的集合,一个存储该结点所有子结点的集合,以及当前结点的父结点的变量。
  • 所有叶子结点都在痛一层上。

B-树为什么比二叉排序树查找效率高?
因为B-树左右子树深度相同,所以可避免出现像二叉排序树那样的分支退化现象;另外,由于B-树每个结点的子结点一般多于2个,所以B-树的高度较二叉排序树的高度较低,因此,B-树是一种较二叉排序树动态查找效率要高的树机构。

B-树的查找算法:

B-树的查找算法和二叉排序树的查找算法类似,在B-树上查找元素数据(确切的说是查找数据元素的关键字)key的方法为:将key与根结点的K(i)逐个顺序比较:

  • 若key=k(i),则查找成功;
  • 若key<k(i).则沿着指针P(i-1)所指的子树继续查找;
  • 若k(i)<key<k(i+1).则沿着指针P(i)所指的子树继续查找;
  • 若key>k(n).则沿着指针P(n)所指的子树继续查找;

B-树的插入算法:
设B-树阶为N,新结点一定插入到叶子层,通过检索可以确定应插入的位置:
此时可以分为两种情况:

  • 要插入的结点还有空位置,就是当前该结点的关键字树<N-1:
    直接将数据元素Key插入到该结点的合适位置上,即满足插入后该结点上的数据元素仍然有序;
  • 要插入的结点没有空位置,就是当前该结点的关键字树=N-1:
    说明该结点已经没有空位置了要插入就要分裂该结点
    结点分裂的方法:
    以中间数据元素为界,把结点分为两个结点,并把中间数据元素插入到双亲结点上,若双亲结点未满则插入到双亲结点合适位置上,否则按同样的方法向上分裂,若根结点进行了分裂,则B-树的高度+1.

B-树的删除算法:

  1. 利用B-树的查找算法找出数据元素所在的结点;

  2. 在结点上删除数据元素又分为两种情况:
    ①:在叶子结点上删除数据元素
    case 1: 该结点上数据元素的个数>=⌈N/2⌉(删除了那个数据元素也不影响B-树的结构,直接删除即可);在这里插入图片描述
    case 2: 该结点上数据元素的个数<=⌈N/2⌉-1(删除了那个数据元素会影响B-树的结构),并且该结点的左(或右)兄弟结点(如果存在)中有数据元素大于⌈N/2⌉-1:
    处理方法:将该结点的左(或右)兄弟结点中数据元素最大(或最小)的上移到双亲结点中,同时将双亲结点中大于(或小于)上移元素的数据元素下移到该结点中。在这里插入图片描述
    case 3: 该结点上数据元素的个数<=⌈N/2⌉-1(删除了那个数据元素会影响B-树的结构),并且该结点的左(或右)兄弟结点(如果存在)中所有数据元素均等于⌈N/2⌉-1:
    处理方法:把要删除数据元素的结点与其兄弟结点及其双亲结点分割二者的数据元素合并成一个结点。在这里插入图片描述

    ②:在非叶子结点上删除数据元素的算法思想:
    假设要删除一个结点的数据元素K(i),首先寻找该结点P(i+1)所指的子树中的最小数据元素K(min),(注意:P(i+1)所指的子树中的最小数据元素K(min)一定是在叶子结点上,然后用K(min)覆盖要删除数据元素K(i),最后只要删除K(min)数据元素就行了。(这样就把非叶子结点删除数据元素问题转到删除叶子结点的数据元素上了)。在这里插入图片描述

2-3树

2-3树是由二结点和三结点构成的树;

  • 有两个结点的结点叫二结点,二结点要么没有子节点,要么有两个子节点;
  • 有三个结点的结点叫三结点,三结点要么没有子节点,要么有三个子节点;

如图所示:
在这里插入图片描述

2-3树插入数据图解

我们根据给出的数据构建一颗2-3树
[16,24,12,32,14,26,34,10,8,28,38,20]
在这里插入图片描述
代码实现
推荐看这位大佬用java语言写的,写的很好。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值