B树的删除
-
查找要删除的关键字target所在的节点和位置
-
Case 1:如果target是在叶子节点直接删除关键字
Case 2:如果target不是在叶子节点,则从“子孙节点”中找到比target大的最小关键字,将该关键字移到目标关键字节点并覆盖目标关键字。并在叶子节点中删除提上来的这个关键字。 -
调整B树
调整B树的算法
因为节点的关键字数量为ceil(m/2)-1<=n<=m-1
- 遍历B树如果有一个节点的关键字小于下限即(ceil(m/2)-1),则调整该节点
- 检查该节点的右兄弟节点关键字个数是否等于下限,如果不等于下限,则向右兄弟节点拿一个关键字
- 如果右兄弟节点等于,则坚持该节点左兄弟节点关键字是否等于下限,如果不等于下限,则向左兄弟节点拿一个关键字
- 2,3都不成立则合并节点
- 重复步骤一,直至B树不需要调整
例:5阶B树,关键字范围[2,4]
1.删除21,叶子节点删除21后处于最小值直接删除
2.删除27,因为27不是在叶子节点,所以找到比27大的最小关键字,然后用该关键字覆盖27,并且删除该关键字
又因为当前节点小于2,而右兄弟节点等于最小值,所以将左兄弟节点拿一个key,所以父节点28下移,左兄弟节点26上移
接着删除32,因为删除32之后当前节点只有一个关键字而且兄弟节点也只有2个关键字,所以合并节点,将30下移到兄弟节点,并且31合并过去
删除40,因为当前节点为1,且兄弟节点都是等于2所以进行合并,36下移39合并到左兄弟节点
合并后当前节点也是1小于最小值,且兄弟节点等于最小值依旧进行合并,33下移41左移