I would have thought this query was vague. Not trees that grow from the ground, but trees with nodes and directories.
Assuming this, the most abstract tree I can think of has a root item with children (if it has any). Every item, including the root, should have a pointer to its first child item (if it has children), its last child item (if it has children), its parent, and the items that come after and before itself. Each item can have its own data structure such as the following:
Code:
typedef struct _treeitemstruct{
struct _treeitemstruct * parent;
struct _treeitemstruct * firstchild;
struct _treeitemstruct * lastchild;
struct _treeitemstruct * prev;
struct _treeitemstruct * next;
// add other data here
}TREEITEMSTRUCT;
You should probably find a way to link (and unlink) the items in this manner.
You should call malloc to dynamically allocate the item structures, when necessary, so they can easily be freed just by traversing the tree from the root item (which also should be allocated).