# to_nested_tuple#

to_nested_tuple(T, root, canonical_form=False)[source]#

Returns a nested tuple representation of the given tree.

The nested tuple representation of a tree is defined recursively. The tree with one node and no edges is represented by the empty tuple, `()`. A tree with `k` subtrees is represented by a tuple of length `k` in which each element is the nested tuple representation of a subtree.

Parameters:
TNetworkX graph

An undirected graph object representing a tree.

rootnode

The node in `T` to interpret as the root of the tree.

canonical_formbool

If `True`, each tuple is sorted so that the function returns a canonical form for rooted trees. This means “lighter” subtrees will appear as nested tuples before “heavier” subtrees. In this way, each isomorphic rooted tree has the same nested tuple representation.

Returns:
tuple

A nested tuple representation of the tree.

Notes

This function is not the inverse of `from_nested_tuple()`; the only guarantee is that the rooted trees are isomorphic.

Examples

The tree need not be a balanced binary tree:

```>>> T = nx.Graph()
>>> T.add_edges_from([(0, 1), (0, 2), (0, 3)])
>>> T.add_edges_from([(1, 4), (1, 5)])
>>> T.add_edges_from([(3, 6), (3, 7)])
>>> root = 0
>>> nx.to_nested_tuple(T, root)
(((), ()), (), ((), ()))
```

Continuing the above example, if `canonical_form` is `True`, the nested tuples will be sorted:

```>>> nx.to_nested_tuple(T, root, canonical_form=True)
((), ((), ()), ((), ()))
```

Even the path graph can be interpreted as a tree:

```>>> T = nx.path_graph(4)
>>> root = 0
>>> nx.to_nested_tuple(T, root)
((((),),),)
```