删除流程:
1、若是空树,立刻返回
2、不是空树,找到要删除的key的位置
(1)直接删除掉key,不需要其他操作,结束
(2)删除掉key后,该叶子节点的size小于min_size,兄弟节点有空位,需要和兄弟节点合并
(3)删除掉key后,该叶子节点的size小于min_size,兄弟节点没有空位,需要和兄弟节点合并之后进行再分配。
合并和分配也会涉及到父节点的变动,父节点也可能会面临合并和分配的问题,需要递归调用。
CoalesceOrRedistribute函数会判断key删除后该节点是否需要合并和分配,若不需要则是情况1。
注意:我的实现中删除掉了10,根节点并没有变化,依然有10,这在书中也有提到,是允许的。
关键函数: CoalesceOrRedistribute
Redistribute:
先找兄弟节点,根据node在父节点中对应的key是在最左边还是其他情况。
若是最左边,则兄弟节点在右边,将兄弟的头移动到node的尾。
若是其余节点,兄弟节点在左边,将兄弟的尾移到node的头。
注意node已经删除掉了目标key,若触发合并或分配现在的size必为minsize-1,兄弟节点给它一个kv就行,就能保证node的size为minsize。
接着更新一下父节点的索引。
Coalescs:
执行一个将当前节点全移动到兄弟节点上,并把父节点指向当前节点的kv删除。
注意还是要分节点在最左边和其他位置讨论,因为涉及到父节点更新的key不一样。
递归向上