void Remove(item **v, int k){ if (*v == 0) return; if (k < (*v)->key) Remove(&((*v)->left), k); else if (k > (*v)->key) Remove(&((*v)->right), k); else { if ((*v)->left == 0 && (*v)->right == 0){ free(*v); *v = 0; } else if (((*v)->left != 0) != ((*v)->right != 0)){ if ((*v)->left != 0){ **v = *((*v)->left); free((*v)->left); } else { **v = *((*v)->right); free((*v)->right); } } else { item *t, *last; for (last = *v, t = (*v)->right; t->left; last = t, t = t->left); (*v)->key = t->key; if (last->right == t) Remove(&(last->right), t->key); else Remove(&(last->left), t->key); } } }