# 算法导论 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. 