一颗m阶的B树定义如下:
1)Math.ceil(m/2)-1<=非根结点关键字个数<=m-1。
2)根结点最少可以只有1个关键字。
3)所有叶子结点都位于同一层。
B树插入操作:
1)根据要插入的key的值,找到叶子结点并插入。
2)判断当前结点key的个数是否<=m-1,若满足则插入操作完成;否则进行第3步。
3)以结点中间的key为中心分裂成左右两部分,然后将这个中间的key插入到父结点中,这个key的左指针指向分裂后的左半部分,这个key的右指针指向分裂后的右半部分,循环进行第2步、第3步。
B树删除操作:
1)如果当前需要删除的key位于非叶子结点上,则用后继key(大于key)覆盖要删除的key,然后在后继key所在的结点中删除该后继key。然后执行第2步。
2)已经删除后继key的结点的key个数>=Math.ceil(m/2)-1(也就是m阶B树结点关键字个数最小要求),结束删除操作;否则执行第3步(结点关键字个数不满足B树要求了)。
3)如果兄弟结点key个数大>Math.ceil(m/2)-1,则父结点中的key下移到该结点,兄弟结点中的一个key上移,删除操作结束。
如果兄弟结点关键字个数刚好=Math.ceil(m/2)-1,将父结点中的key下移与当前结点及它的兄弟结点中的key合并,形成一个新的结点。原父结点中的key的两个孩子指针就变成了一个指针,指向这个新结点。循环进行第2步、第3步。
有些结点它可能即有左兄弟,又有右兄弟,那么我们任意选择一个兄弟结点进行操作即可。