A function for creating networkx instances that can be used
            more efficiently for graph manipulation than the MergeTree
            class.
            @ In, thisTree, a MergeTree instance for which we will
                construct a networkx graph
            @ In, thatTree, a MergeTree instance optionally used to
                speed up the processing by bypassing the fully augmented
                search and only focusing on the partially augmented
                split and join trees
            @ Out, nxTree, a networkx.Graph instance matching the
                details of the input tree.

def _construct_nx_tree(self, thisTree, thatTree=None):
        """ A function for creating networkx instances that can be used
            more efficiently for graph manipulation than the MergeTree
            class.
            @ In, thisTree, a MergeTree instance for which we will
                construct a networkx graph
            @ In, thatTree, a MergeTree instance optionally used to
                speed up the processing by bypassing the fully augmented
                search and only focusing on the partially augmented
                split and join trees
            @ Out, nxTree, a networkx.Graph instance matching the
                details of the input tree.
        """
        if self.debug:
            sys.stdout.write("Networkx Tree construction: ")
            start = time.clock()

        nxTree = nx.DiGraph()
        nxTree.add_edges_from(thisTree.edges)

        nodesOfThatTree = []
        if thatTree is not None:
            nodesOfThatTree = thatTree.nodes.keys()

        # Fully or partially augment the join tree
        for (superNode, _), nodes in thisTree.augmentedEdges.items():
            superNodeEdge = list(nxTree.out_edges(superNode))
            if len(superNodeEdge) > 1:
                warnings.warn(
                    "The supernode {} should have only a single "
                    "emanating edge. Merge tree is invalidly "
                    "structured".format(superNode)
                )
            endNode = superNodeEdge[0][1]
            startNode = superNode
            nxTree.remove_edge(startNode, endNode)
            for node in nodes:
                if thatTree is None or node in nodesOfThatTree:
                    nxTree.add_edge(startNode, node)
                    startNode = node

            # Make sure this is not the root node trying to connect to
            # itself
            if startNode != endNode:
                nxTree.add_edge(startNode, endNode)

        if self.debug:
            end = time.clock()
            sys.stdout.write("%f s\n" % (end - start))

        return nxTree