def postorder(self):
nodes_random = self.nodes()<EOL>nodes_by_branch = sorted(nodes_random, cmp=self.cmp_branch)<EOL>nodes_topological = []<EOL>for node in nodes_by_branch:<EOL><INDENT>self.dfs(node, nodes_topological)<EOL><DEDENT>self.clear_nodes()<EOL>nodes_consecutive = []<EOL>for node in nodes_topological:<EOL><INDENT>Node = self[node]<EOL>outgoing_nodes = Node.nodes()<EOL>if outgoing_nodes:<EOL><INDENT>last_index = max([nodes_consecutive.index(on) for on inoutgoing_nodes])<EOL>nodes_consecutive.insert(last_index + <NUM_LIT:1>, node)<EOL><DEDENT>else:<EOL><INDENT>nodes_consecutive.append(node)<EOL><DEDENT><DEDENT>return nodes_consecutive<EOL>
Returns a valid postorder of the **node objects** of the ``DictGraph`` 
*if* the topology is a directed acyclic graph. This postorder is 
semi-random, because the order of elements in a dictionary is 
semi-random and so are the starting nodes of the depth-first search 
traversal, which determines the postorder, consequently some postorders
will be discovered more frequently.

This postorder enforces some determinism on particular ties:

  - toplogically equivalent branches come first are sorted by length
    (shorter branches come first).
  - if the topological Nodes corresponding to the node objects have
    a ``"branch"`` attribute it will be used to sort the graph from 
    left to right.

However the final postorder is still *not* deterministic.