<!-- ##### SECTION Title ##### -->
N-ary Trees

<!-- ##### SECTION Short_Description ##### -->
trees of data with any number of branches

<!-- ##### SECTION Long_Description ##### -->
<para>
The #GNode struct and its associated functions provide a N-ary tree data
structure, where nodes in the tree can contain arbitrary data.
</para>
<para>
To create a new tree use g_node_new().
</para>
<para>
To insert a node into a tree use g_node_insert(), g_node_insert_before(),
g_node_append() and g_node_prepend().
</para>
<para>
To create a new node and insert it into a tree use g_node_insert_data(), 
g_node_insert_data_before(), g_node_append_data() and g_node_prepend_data().
</para>
<para>
To reverse the children of a node use g_node_reverse_children().
</para>
<para>
To find a node use g_node_get_root(), g_node_find(), g_node_find_child(),
g_node_child_index(), g_node_child_position(), 
g_node_first_child(), g_node_last_child(),
g_node_nth_child(), g_node_first_sibling(), g_node_prev_sibling(),
g_node_next_sibling() or g_node_last_sibling().
</para>
<para>
To get information about a node or tree use G_NODE_IS_LEAF(),
G_NODE_IS_ROOT(), g_node_depth(), g_node_n_nodes(), g_node_n_children(),
g_node_is_ancestor() or g_node_max_height().
</para>
<para>
To traverse a tree, calling a function for each node visited in the
traversal, use g_node_traverse() or g_node_children_foreach().
</para>
<para>
To remove a node or subtree from a tree use g_node_unlink() or
g_node_destroy().
</para>

<!-- ##### SECTION See_Also ##### -->
<para>

</para>

<!-- ##### SECTION Stability_Level ##### -->


<!-- ##### STRUCT GNode ##### -->
<para>
The <structname>GNode</structname> struct represents one node in a
<link linkend="glib-N-ary-Trees">N-ary Tree</link>.
fields 
</para>

@data: contains the actual data of the node.
@next: points to the node's next sibling (a sibling is another 
  <structname>GNode</structname> with the same parent).
@prev: points to the node's previous sibling.
@parent: points to the parent of the <structname>GNode</structname>,
  or is %NULL if the <structname>GNode</structname> is the root of the tree.
@children: The <structfield>children</structfield> field points to the first 
  child of the <structname>GNode</structname>. The other children are accessed 
  by using the <structfield>next</structfield> pointer of each child.

<!-- ##### FUNCTION g_node_new ##### -->
<para>

</para>

@data: 
@Returns: 


<!-- ##### FUNCTION g_node_copy ##### -->
<para>

</para>

@node: 
@Returns: 


<!-- ##### USER_FUNCTION GCopyFunc ##### -->
<para>

</para>

@src: 
@data:
@Returns: 


<!-- ##### FUNCTION g_node_copy_deep ##### -->
<para>

</para>

@node: 
@copy_func: 
@data: 
@Returns: 


<!-- ##### FUNCTION g_node_insert ##### -->
<para>

</para>

@parent: 
@position: 
@node: 
@Returns:


<!-- ##### FUNCTION g_node_insert_before ##### -->
<para>

</para>

@parent: 
@sibling:
@node: 
@Returns:


<!-- ##### FUNCTION g_node_insert_after ##### -->
<para>

</para>

@parent: 
@sibling: 
@node:
@Returns: 


<!-- ##### MACRO g_node_append ##### -->
<para>

</para>

@parent: 
@node: 
@Returns:


<!-- ##### FUNCTION g_node_prepend ##### -->
<para>

</para>

@parent: 
@node: 
@Returns:


<!-- ##### MACRO g_node_insert_data ##### -->
<para>

</para>

@parent: 
@position:
@data: 
@Returns:


<!-- ##### MACRO g_node_insert_data_before ##### -->
<para>

</para>

@parent:
@sibling:
@data: 
@Returns:


<!-- ##### MACRO g_node_append_data ##### -->
<para>

</para>

@parent:
@data:
@Returns:


<!-- ##### MACRO g_node_prepend_data ##### -->
<para>

</para>

@parent:
@data:
@Returns:


<!-- ##### FUNCTION g_node_reverse_children ##### -->
<para>

</para>

@node:


<!-- ##### FUNCTION g_node_traverse ##### -->
<para>

</para>

@root: 
@order: 
@flags: 
@max_depth: 
@func: 
@data: 


<!-- ##### ENUM GTraverseFlags ##### -->
<para>
Specifies which nodes are visited during several of the tree functions,
including g_node_traverse() and g_node_find().
</para>

@G_TRAVERSE_LEAVES: only leaf nodes should be visited. This name has been
  introduced in 2.6, for older version use %G_TRAVERSE_LEAFS.
@G_TRAVERSE_NON_LEAVES: only non-leaf nodes should be visited. This name 
  has been introduced in 2.6, for older version use %G_TRAVERSE_NON_LEAFS.
@G_TRAVERSE_ALL: all nodes should be visited.
@G_TRAVERSE_MASK: a mask of all traverse flags.
@G_TRAVERSE_LEAFS: identical to %G_TRAVERSE_LEAVES.
@G_TRAVERSE_NON_LEAFS: identical to %G_TRAVERSE_NON_LEAVES.

<!-- ##### USER_FUNCTION GNodeTraverseFunc ##### -->
<para>
Specifies the type of function passed to g_node_traverse().
The function is called with each of the nodes visited, together with the
user data passed to g_node_traverse().
If the function returns %TRUE, then the traversal is stopped.
</para>

@node: a #GNode.
@data: user data passed to g_node_traverse().
@Returns: %TRUE to stop the traversal.


<!-- ##### FUNCTION g_node_children_foreach ##### -->
<para>

</para>

@node: 
@flags:
@func:
@data:


<!-- ##### USER_FUNCTION GNodeForeachFunc ##### -->
<para>
Specifies the type of function passed to g_node_children_foreach().
The function is called with each child node, together with the user data
passed to g_node_children_foreach().
</para>

@node: a #GNode.
@data: user data passed to g_node_children_foreach().


<!-- ##### FUNCTION g_node_get_root ##### -->
<para>

</para>

@node:
@Returns:


<!-- ##### FUNCTION g_node_find ##### -->
<para>

</para>

@root: 
@order:
@flags: 
@data: 
@Returns:


<!-- ##### FUNCTION g_node_find_child ##### -->
<para>

</para>

@node:
@flags: 
@data:
@Returns: 


<!-- ##### FUNCTION g_node_child_index ##### -->
<para>

</para>

@node:
@data:
@Returns:


<!-- ##### FUNCTION g_node_child_position ##### -->
<para>

</para>

@node: 
@child: 
@Returns:


<!-- ##### MACRO g_node_first_child ##### -->
<para>

</para>

@node:
@Returns:


<!-- ##### FUNCTION g_node_last_child ##### -->
<para>

</para>

@node:
@Returns: 


<!-- ##### FUNCTION g_node_nth_child ##### -->
<para>

</para>

@node:
@n:
@Returns:


<!-- ##### FUNCTION g_node_first_sibling ##### -->
<para>

</para>

@node: 
@Returns: 


<!-- ##### MACRO g_node_next_sibling ##### -->
<para>

</para>

@node: 
@Returns:


<!-- ##### MACRO g_node_prev_sibling ##### -->
<para>

</para>

@node: 
@Returns:


<!-- ##### FUNCTION g_node_last_sibling ##### -->
<para>

</para>

@node:
@Returns:


<!-- ##### MACRO G_NODE_IS_LEAF ##### -->
<para>

</para>

@node: 
@Returns:


<!-- ##### MACRO G_NODE_IS_ROOT ##### -->
<para>

</para>

@node:
@Returns:


<!-- ##### FUNCTION g_node_depth ##### -->
<para>

</para>

@node: 
@Returns: 


<!-- ##### FUNCTION g_node_n_nodes ##### -->
<para>

</para>

@root:
@flags:
@Returns:


<!-- ##### FUNCTION g_node_n_children ##### -->
<para>

</para>

@node: 
@Returns: 


<!-- ##### FUNCTION g_node_is_ancestor ##### -->
<para>

</para>

@node: 
@descendant:
@Returns: 


<!-- ##### FUNCTION g_node_max_height ##### -->
<para>

</para>

@root: 
@Returns: 


<!-- ##### FUNCTION g_node_unlink ##### -->
<para>

</para>

@node: 


<!-- ##### FUNCTION g_node_destroy ##### -->
<para>

</para>

@root: 


<!-- ##### FUNCTION g_node_push_allocator ##### -->
<para>
Sets the allocator to use to allocate #GNode elements.
Use g_node_pop_allocator() to restore the previous allocator.
</para>
<para>
Note that this function is not available if GLib has been compiled
with <option>--disable-mem-pools</option>
</para>

@dummy: the #GAllocator to use when allocating #GNode elements.
@Deprecated: 2.10: It does nothing, since #GNode has been converted 
  to the <link linkend="glib-Memory-Slices">slice allocator</link>


<!-- ##### FUNCTION g_node_pop_allocator ##### -->
<para>
Restores the previous #GAllocator, used when allocating #GNode elements.
</para>
<para>
Note that this function is not available if GLib has been compiled
with <option>--disable-mem-pools</option>
</para>

@Deprecated: 2.10: It does nothing, since #GNode has been converted 
  to the <link linkend="glib-Memory-Slices">slice allocator</link>


