Remove (Implementation)

  • Implement the core operations of an OrderedSet efficiently with a Binary Search Tree.

Exercise Complete the implementation of remove.

@Override public void remove(T t) { // TODO Implement Me! }

Hint: Go for a recursive implementation. An iterative one without having a parent pointer in the Node class will be tough to carry out.

Solution
@Override public void remove(T t) { root = remove(root, t); }
// always call as follows: subtree = remove(subtree, data); private Node<T> remove(Node<T> node, T t) { // if node == null, element isn't present --> don't do anything if (node != null) { int comparisonResult = t.compareTo(node.data); if (comparisonResult < 0) { node.left = remove(node.left, t); } else if (comparisonResult > 0) { node.right = remove(node.right, t); } else { // comparisonResult == 0 --> found the element! node = removeSubtreeRoot(node); } } return node; }
// always call as follows: subtree = removeSubtreeRoot(subtree) // pre: node != null private Node<T> removeSubtreeRoot(Node<T> node) { if (node.left == null) { node = node.right; numElements--; } else if (node.right == null) { node = node.left; numElements--; } else { // two children: T smallestRight = getSmallestElement(node.right); node.data = smallestRight; node.right = remove(node.right, smallestRight); // takes care of numElements-- } return node; }
// pre: node != null private T getSmallestElement(Node<T> node) { while (node.left != null) { node = node.left; } return node.data; }