使用堆栈以DFS顺序遍历图形

时间:2017-10-23 20:11:57

标签: java graph iteration depth-first-search graph-traversal

我试图以dfs的顺序迭代地遍历图表 以下是我的代码。 当我测试它时,输出与递归dfs的输出不同(也包括在下面)。

有人可以帮忙调试吗?

  public static void dfs(GraphNode root) {
        if (root != null && !root.visited) {
            for (GraphNode kid : root.children) {
                dfs(kid);
            }
            System.out.println(root);
            root.visited = true;
        }
    }

  public static void dfsIter(GraphNode root) {
        Stack<GraphNode> stack = new Stack<>();
        stack.push(root);

        do {
            GraphNode cur = stack.pop();
            if (cur != null && !cur.visited) {
                // leaf node or all children have been visisted
                if (cur.children.isEmpty() || childrenVisisted(cur)) {
                    System.out.println(cur);
                    cur.visited = true;
                }
                else {
                    // put it back
                    stack.push(cur);
                    for (GraphNode child :cur.children) {
                        if (!child.visited) {
                            stack.push(child);
                        }
                    }
                }

            }
        }
        while (!stack.isEmpty());
    }

    static boolean childrenVisisted(GraphNode node) {
        for (GraphNode child : node.children) {
            if (!child.visited) return false;
        }
        return true;
    }

1 个答案:

答案 0 :(得分:2)

  1. 在递归DFS中,您应首先标记顶点,然后遍历子节点。否则,如果图表有周期,您将获得无限循环。
  2. 如果在迭代方法中需要相同的遍历顺序,则需要以相反的顺序将子项添加到堆栈中。因为您首先弹出最后一个推送元素。