I have to say I have spent quite some time trying to figure this one out.
My current position is that it is not worth the effort. In almost all cases, you need some specialized handling of trees and for those, existing containers are quite fine.
So now I usually use some sort of Array or ArrayMap to represent trees.
I guess the most simple method is something like:
struct Node {
int parent;
....
};
Array<Node> tree;
where parent is either directly index of parent node in 'tree', or some mode sophisticated thing, like database id, in that case
ArrayMap<int, Node> tree;
is perhaps better. Of course, at this point get varied by actual requirements.