/** * GTraverseFunc: * @key: a key of a #GTree node * @value: the value corresponding to the key * @data: user data passed to g_tree_traverse() * * Specifies the type of function passed to g_tree_traverse(). It is * passed the key and value of each node, together with the @user_data * parameter passed to g_tree_traverse(). If the function returns * %TRUE, the traversal is stopped. * * Returns: %TRUE to stop the traversal */ void g_tree_traverse (GTree *tree, GTraverseFunc traverse_func, GTraverseType traverse_type, gpointer user_data) { g_return_if_fail (tree != NULL); if (!tree->root) return; switch (traverse_type) { case G_PRE_ORDER: g_tree_node_pre_order (tree->root, traverse_func, user_data); break; case G_IN_ORDER: g_tree_node_in_order (tree->root, traverse_func, user_data); break; case G_POST_ORDER: g_tree_node_post_order (tree->root, traverse_func, user_data); break; case G_LEVEL_ORDER: g_warning ("g_tree_traverse(): traverse type G_LEVEL_ORDER isn't implemented."); break; } }
static gint g_tree_node_post_order (GTreeNode *node, GTraverseFunc traverse_func, gpointer data) { if (node->left) { if (g_tree_node_post_order (node->left, traverse_func, data)) return TRUE; } if (node->right) { if (g_tree_node_post_order (node->right, traverse_func, data)) return TRUE; } if ((*traverse_func) (node->key, node->value, data)) return TRUE; return FALSE; }