/** Inserts a right child at a given node. */
public Position insertRight(Position v, Object e)
throws InvalidPositionException {
if (hasRight(v))
throw new InvalidPositionException("Node already has a right child");
BTPosition vv = (BTPosition)v;
BTPosition w = createNode(e, vv, null, null);
vv.setRight(w);
size++;
return w;
}
/** Removes a node with zero or one child. */
public Object remove(Position v)
throws InvalidPositionException {
if (hasLeft(v) && hasRight(v))
throw new InvalidPositionException("Cannot remove node w/ 2 children");
BTPosition vv = (BTPosition)v;
BTPosition ww; // the only child of v, if any
if (hasLeft(v))
ww = (BTPosition) left(v);
else if (hasRight(v))
ww = (BTPosition) right(v);
else
ww = null;
if (v == root()) {
if (ww != null)
ww.setParent(null);
root = ww;
}
else {
BTPosition uu = (BTPosition) parent(v);
if (hasLeft(uu) && v == left(uu))
uu.setLeft(ww);
else
uu.setRight(ww);
if(ww != null)
ww.setParent(uu);
}
size--;
return v.element();
}