@Override
	public NodeFSNB<T> addSubtree(Node<T> parent, Tree<T> st) {
		// TODO pay attention!!
		if (!(parent instanceof NodeFSNB) || !(st instanceof TreeFSNB)) {
			throw new DifferentNodeTypesException();
		} else if (isSafe() && !contains(parent)) {
			throw new NodeNotFoundException();
		}
		NodeFSNB<T> n = (NodeFSNB<T>) parent;
		NodeFSNB<T> str = (NodeFSNB<T>) st.getRoot();
		str.clearContainerPointer();
		str.setNext(n.getFirst());
		n.setFirst(str);
		modified = true;
		if (((TreeFSNB<T>) st).isSafe()) {
			size += st.size();
		}
		st.clear(); // this avoid undesired aliasing
		return n;
	}