Design of tree data structure
I think this is OK, but there are a few things I'd consider changing.


Your helpers should be protected or private, since they should only be being called by the non-helper methods.
You should consider the const-ness of your methods. e.g. you want void printTree() const.
If you're using this pattern a lot, you could consider using a visitor pattern for things that traverse the tree, and a builder style pattern for things that build the tree. This way printTree could be moved outside the class and implemented as something like

void printTree(const Tree&amp; tree) { 
  tree.visit( TreePrinter() );
}


And similarly the deserializeTree function would be replaced with a constructor like this

Tree tree( TreeBuilderFromString(rep) );

It looks like the code reads a balanced (or almost balanced) tree. But since presumably you can build a non-balanced tree, serialization followed by deserialization will not generate the original tree. (Maybe this is expected and OK, but it may surprise someone when they try to use the class)