算法导论 B树

# 算法导论 B树

1. B对定义
   1. 类似于红黑树,一个结点*x*包含*n*个关键字*key1...keyN*,这些关键字是按升序排序的。
   2. 如果结点*x*为非叶子结点*leaf*=*false*,则它有n+1个子结点,每个关键字*key.i*前后都有子结点*c.i*,*c.i+1*;也全是按升序排序的,
   3. B树有一个度数*t(>=2)*,除根结点以外其他结点最少包含t-1个关键字,所有结点最多包含*2t-1*个关键字(满的结点)
   4. 所有叶子结点都有相同的高度h
2. B树的操作
   1. 搜索k
      1. 类似于搜索二叉搜索树,做多路分支选择
      2. 从左往右找出第一个大于等于搜索k的关键字*key.i*;如果*key.i* == k,则直接返回 ;如果是叶子结点且*key.i != k*,则查找不成功并返回;否则递归在子结点*c.i*中查找
   2. 插入
      1. 分裂结点
         1. 在向下查找值k向叶结点的插入位置时,如果遇到满的结点(2t-1个关键字),则将中间关键字*key.i*提升到父类,并分成两个t-1个关键字的左右结点;从而使插入时能够符合B树规范;
   3. 删除
      1. 无论何时,非根结点的内部结点x至少包含t个关键字,比B树定义多一个,以使得子结点可以借用一个关键字后仍符合B树规范
      2. 情况1,如果删除的值k在叶子结点x上,且删除后仍满足B树定义的t-1个关键字,则直接删除k
      3. 情况2,如果删除的值k在内部结点x上
         1. 如果关键字k的左子结点有t个以上关键字,则把左子结点为根的树的最后一位*k2*替换关键字k,并递归删除树中的*k2*
         2. 如果关键字k的右子结点有t个以上关键字,则把右子结点为根的树最前面的关键字*k2*替换关键字k,并递归删除树中的*k2*
         3. 否则,即关键字k左右子结点都只有t-1个关键字,则先把左子结点、关键字k和右子结点合并,然后再删除关键字k
      4. 情况3,如果删除的值k不在当前结点x上,则在x的子结点 *c.i* 中,且 *c.i* 只有t-1个关键字;这里针对的是子结点而不是情况1、情况2的当前结点上。
         1. 如果子结点 *c.i* 相邻的左右子结点有t个关键字,则将相邻的兄弟节点(x中的左子结点或右子结点)的一个关键字移动到该节点x上, *key.i* 移动到子结点 *c.i* 上,该兄弟结点关键字的相关子结点移动到 *c.i*上
         2. 如果所有相邻的兄弟左右子结点都只有t-1个关键字,则与其中一个兄弟结点合并
3. 源代码
   1. [btree源代码](https://gitee.com/beimuaihui/LayaAir/blob/my_introduction_to_algorithms/src/samples/algorith/C18BTree.ts)
4. 运行结果
   1. ![BTree运行结果](https://gitee.com/beimuaihui/LayaAir/raw/my_introduction_to_algorithms/src/samples/algorith/C18BTree.gif)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值