@Override
	public BinaryNodePS<T> addLeftSubtree(Node<T> parent, BinaryTree<T> st) {
		if (!(parent instanceof BinaryNodePS) || !(st instanceof BinaryTreePS)) {
			throw new DifferentNodeTypesException();
		} else if (isSafe() && !contains(parent)) {
			throw new NodeNotFoundException();
		}
		BinaryNodePS<T> bn = (BinaryNodePS<T>) parent;
		if (bn.getLeft() != null) {
			throw new ExistingNodeException();
		}
		BinaryNodePS<T> str = (BinaryNodePS<T>) st.getRoot();
		str.clearContainerPointer();
		bn.setLeft(str);
		str.setParent(bn);
		modified = true;
		if (((BinaryTreePS<T>) st).isSafe()) {
			size += st.size();
		}
		st.clear(); // this avoid undesired aliasing
		return bn;
	}