btree_node *btree_delete(btree_node *root, int target) { if(1 == root->num) { btree_node *y = root->p[0]; btree_node *z = root->p[1]; if(NULL != y && NULL != z && M - 1 == y->num && M - 1 == z->num) { btree_merge_child(root, 0, y, z); free(root); btree_delete_nonone(y, target); return y; } else { btree_delete_nonone(root, target); return root; } } else { btree_delete_nonone(root, target); return root; } }
void BPlusTree::btree_delete_nonone(btree_node *root, int target) { if(true == root->is_leaf) { int i = 0; while(i < root->num && target > root->k[i]) i++; if(target == root->k[i]) { for(int j = i + 1; j < 2 * M - 1; j++) { root->k[j-1] = root->k[j]; } root->num -= 1; btree_node_num-=1; } else { printf("target not found\n"); } } else { int i = 0; btree_node *y = NULL, *z = NULL; while(i < root->num && target > root->k[i]) i++; y = root->p[i]; if(i < root->num) { z = root->p[i+1]; } btree_node *p = NULL; if(i > 0) { p = root->p[i-1]; } if(y->num == M - 1) { if(i > 0 && p->num > M - 1) { btree_shift_to_right_child(root, i-1, p, y); } else if(i < root->num && z->num > M - 1) { btree_shift_to_left_child(root, i, y, z); } else if(i > 0) { btree_merge_child(root, i-1, p, y); y = p; } else { btree_merge_child(root, i, y, z); } btree_delete_nonone(y, target); } else { btree_delete_nonone(y, target); } } }