typedef struct _Tree {
void *data;
struct _Tree **child;
size_t n_child;
} Tree;

typedef void (*ForeachFunc)( Tree * );

void tree_foreach_preorder( Tree *tree, ForeachFunc func ) {
size_t i;
func( tree );
for ( i = 0; i < tree->n_child; i++ )
tree_foreach_preorder( tree->child[i], func );
}

void tree_foreach_postorder( Tree *tree, ForeachFunc func ) {
size_t i;
for ( i = 0; i < tree->n_child; i++ )
tree_foreach_postorder( tree->child[i], func );
func( tree );
}