protected Node<T> getReplacementNode(Node<T> nodeToRemoved) {
		Node<T> replacement = null;
		if (nodeToRemoved.lesser != null && nodeToRemoved.greater == null) {
			
			// Using the less subtree
			replacement = nodeToRemoved.lesser;
		} else if (nodeToRemoved.greater != null
				&& nodeToRemoved.lesser == null) {
			
			// Using the greater subtree (there is no lesser subtree, no
			// refactoring)
			replacement = nodeToRemoved.greater;
		} else if (nodeToRemoved.greater != null
				&& nodeToRemoved.lesser != null) {
			
			// Two children
			// Add some randomness to deletions, so we don't always use the
			// greatest/least on deletion
			if (modifications % 2 != 0) {
				replacement = this.getGreatest(nodeToRemoved.lesser);
				if (replacement == null)
					replacement = nodeToRemoved.lesser;
			} else {
				replacement = this.getLeast(nodeToRemoved.greater);
				if (replacement == null)
					replacement = nodeToRemoved.greater;
			}
			modifications++;
		}
		return replacement;
	}