function remove(value, T) {
if (nil(T)) return T;
if (value < T.value) {
T.left = remove(value, T.left);
} else if (value > T.value) {
T.right = remove(value, T.right);
} else {
if (leaf(T)) return null;
if (nil(T.left)) {
const L = successor(T);
T.value = L.value;
T.right = remove(L.value, T.right);
} else {
const L = predecessor(T);
T.value = L.value;
T.left = remove(L.value, T.left);
}
}
return T;
}