I agree.

I'm not sure it really needs root passed in either - that is only used in detach, which could be implemented as

void detachRoot()
{
   root.setown(createPTreFromIPT(root));
}