数据结构-B/B+树

B树

定义

B树又称为多路平衡查找树,B树中所有节点的孩子节点个数的最大值称为B树的阶,通常用m表示。一棵m的B树或为空树,或为满足如下特性的m叉树:

  • 树中每个节点之多有m棵子树,即之多有m-1个关键字;
  • 若根节点不是终端节点,则至少有两棵子树(所有子树的高度差都相同);
  • 除根节点外的所有非叶子节点至少有m/2棵子树,即至少包含m/2-1个关键字;
  • 所有叶节点都出现在同一层上,并且不带任何信息(实际上这些节点不存在,指向这些节点的指针为空);
  • 所有非叶节点的结构如下:n,p0,k1,p1,k2,...,kn,pn,其中n(m/2<=n<=m-1)为节点中关键字的个数,ki(i=1,2,3,..n)为节点的关键字,且满足k1<k2<k3<..<kn,pi(i=0,1,2,3,...,n)为指向子节点的指针,且指针pi-1锁指向子树的所有节点军小于ki,pi所指子树中所有节点的关键字均大于ki;

插入

新关键字一定是插入到最底层的终端节点(用查找来确定插入的位置)。

在插入关键字后,如果导致原节点的关键字个数超过上限,则从中间位置(m/2)将其中的关键字分为两部分,左边部分包含的关键字放在原节点中,右边部分包含的关键字放到新的节点中,中间位置(m/2)的节点插入原节点的父节点上,若此时导致其父节点关键字个数超过上限,则继续进行这种分裂操作,知道这个过程传导到根节点为止,进而导致B树的高度值加一。

删除

  • 若被删除元素的终端节点中元素的个数不低于下限(m/2)

若被删除关键字在终端节点,则直接删除该关键字;
若被删除关键字在非终端节点,则用直接前驱或直接后继来替换被删除的关键字;
对非终端节点关键字的删除,必然可以转化成对终端节点的删除操作;
     直接前驱:当前关键字左侧指针所指子树中“最右下”的元素;
     直接后继:当前关键字右侧指针所指子树中“最左下”的元素;

  • 若被删除元素的终端节点中元素的个数低于下限(m/2)

若兄弟够借,如果被删除的关键字所在节点删除前的关键字个数低于下限,且与此节点右(或左)兄弟节点的关键字个数还很宽裕(>m/2),则需要调整该节点右(或左)兄弟的节点及其双亲节点(父子交换位置);
若兄弟不够借,则需要将左(或右)兄弟节点和当前节点及其父节点中的根元素进行合并,构成一个新的节点;

B+树

一棵m阶的B+树需要满足下列条件:

  • 每个分支节点最多有m棵子树;
  • 非叶子节点至少有两棵子树,其他每个分支节点至少有m/2棵子树;
  • 结点的子树个数与关键字个数相同;
  • 所有叶子节点包含全部的关键字,及指向相应记录的指针,叶节点将关键字按照大小顺序排列,并且相邻节点按大小顺序相互链接起来;
  • 所有分支节点中仅包含它的各个子节点中关键字的最大值,及指向其子节点的指针;

在B+树中,叶节点包含信息,所有非叶节点仅起到索引的作用,非叶节点中每个索引项只包含对应子树的最大关键字和指向孩子树的指针,不包含关键字对应的记录的存储地址。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

echo20222022

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值