Exemplo n.º 1
0
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);
		}
	}
}