docs: def __get_dfs_data(graph, adj=None):
      """Internal function that calculates the depth-first search of the graph.
      Returns a dictionary with the following data:
          * 'ordering':        A dfs-ordering list of nodes
          * 'ordering_lookup': A lookup dict mapping nodes to dfs-ordering
          * 'node_lookup':     A lookup dict mapping dfs-ordering to nodes
          * 'edge_lookup':     A lookup dict mapping edges as tree-edges or back-edges
          * 'parent_lookup':   A lookup dict mapping nodes to their parent node
          * 'children_lookup': A lookup dict mapping nodes to their children
      """
      ordering, parent_lookup, children_lookup = depth_first_search_with_parent_data(graph, adjacency_lists=adj)
      ordering_lookup = dict(list(zip(ordering, list(range(1, len(ordering) + 1)))))
      node_lookup = dict(list(zip(list(range(1, len(ordering) + 1)), ordering)))
      edge_lookup = {}
  
      for edge_id in graph.get_all_edge_ids():
          edge = graph.get_edge(edge_id)
          node_a, node_b = edge['vertices']
          parent_a = parent_lookup[node_a]
          parent_b = parent_lookup[node_b]
          if parent_a == node_b or parent_b == node_a:
              edge_lookup[edge_id] = 'tree-edge'
          else:
              edge_lookup[edge_id] = 'backedge'
  
      dfs_data = {}
      dfs_data['ordering'] = ordering
      dfs_data['ordering_lookup'] = ordering_lookup
      dfs_data['node_lookup'] = node_lookup
      dfs_data['edge_lookup'] = edge_lookup
      dfs_data['parent_lookup'] = parent_lookup
      dfs_data['children_lookup'] = children_lookup
  
      return dfs_data