private void walkNode(Node n, Set<Node> seenAlready, Map<Node, List<Node>> incomingEdges, Set<Node> rootNodes) { if (!seenAlready.Contains(n)) { seenAlready.add(n); // Check if has no incoming edges if (n.isRoot()) { rootNodes.add(n); } incomingEdges.put(n, new List<Node>(n.getParents())); foreach (Node c in n.getChildren()) { walkNode(c, seenAlready, incomingEdges, rootNodes); } } } }