@Override
	public void remove(T t) {
		Node<T> node = new Node<T>(t);
		lock.lock();
		try {

			if (root == null)
				return;

			if (root.compareTo(node) == 0) {
				if (root.getLeft() == null) {
					root = root.getRight();
				} else if (root.getRight() == null) {
					root = root.getLeft();
				} else {
					// search for the first left leaf on its right subtree
					Node<T> substitute = substituteLookUp(root, root.getRight());
					// the substitute node takes its place.
					substitute.setLeft(root.getLeft());
					substitute.setRight(root.getRight());
					// update the root with the substitute
					root = substitute;
					// return true;
				}
			} else 
				recoursiveRemove(root, root, node);
			
		} finally {
			lock.unlock();
		}
	}