private boolean insertElem(BinaryTreeNode<E> current, E elem)
			throws ValueException {
		if (elem == null) {
			throw new NullPointerException("Given element is null.");
		}

		if (current == null) {
			BinaryTreeNode<E> newNode = new BinaryTreeNode<E>(elem);
			root = newNode;
			counter++; // counter for the elements
			return true;
		} else if (!isComparable(current.data, elem)) {
			throw new ValueException("Element not compareable to root");

		} else if (current.getData().compareTo(elem) >= 0) { // left side and
																// equal
																// getIncome
			if (current.getLeft() == null) {
				BinaryTreeNode<E> newNode = new BinaryTreeNode<E>(elem);
				current.setLeft(newNode);
				counter++;
				return true;
			} else {
				return insertElem(current.getLeft(), elem);
			}
		} else if (current.getData().compareTo(elem) < 0) { // right side
			if (current.getRight() == null) {
				BinaryTreeNode<E> newNode = new BinaryTreeNode<E>(elem);
				current.setRight(newNode);
				counter++;
				return true;

			} else {
				return insertElem(current.getRight(), elem);
			}
		} else {
			return false;
		}
	}