迭代DFS与递归DFS的奇数排序

时间:2011-10-06 22:05:11

标签: java depth-first-search

我正在解决这个dfs/bfs问题。

我写了一个迭代版本和DFS的递归版本。

节点访问的顺序不同,我不明白为什么。

迭代DFS:

static void DFS (Integer root, Graph graph){

      //  System.out.println("DFS");

        HashSet <Integer> explored = new HashSet<Integer>();
             explored.add(root);

        Stack<Integer> stack = new Stack<Integer>();
              stack.add(root);

        int v; int w;


        while (!stack.isEmpty()){

            v=stack.pop();
            explored.add(v);

            System.out.print(v + " ");
           // for (int i=graph.adjacencies.get(v).size()-1; i>=0; i--) {
            for (int i=0; i < graph.adjacencies.get(v).size(); i++) {
                w = graph.adjacencies.get(v).get(i);

                if (!explored.contains(w)){

                    stack.add(w);
                    explored.add(w);
                }
            }

        }System.out.println();
    } 

递归DFS:

static void DFS_2 (Integer root, Graph graph){

//        System.out.println("DFS_2");

        int v; int w;

        v = root;

        graph.explored.add(v);

            System.out.print(v + " ");
            for (int i=0; i < graph.adjacencies.get(v).size(); i++) {

                w = graph.adjacencies.get(v).get(i);

                if (!graph.explored.contains(w)){

                    graph.explored.add(w);
                    DFS_2(w, graph);
                }
            }


    }

关于教程问题,我在迭代DFS版本上的输出是

1 4 3 2 6

虽然它应该是(根据问题样本输出和递归版本):

1 3 2 6 4

这里发生了什么?为什么消除递归改变访问节点顺序?

- &GT; Full code on a Netbeans project

2 个答案:

答案 0 :(得分:3)

检查您的graph.adjacencies.get(V),他们是否会针对这两种情况给出相同的回复?如果是这样,那么递归调用和堆栈调用将给出不同的结果。例如,一棵树,如:

      1
    2   3
  4

将为堆栈版本提供1->3->2->4订单,并为递归版本提供1->2->4->3的顺序,假设graph.adjacencies.get(V)始终首先返回左子项。

答案 1 :(得分:1)

因为Stack。它是First-In,Last-Out,因此您将以相反的顺序浏览节点的子节点,并将它们添加到堆栈中。

根据这个顺序(从左到右)说根的2个孩子是A和B.

第一个算法:

  1. 处理根
  2. 将A添加到堆栈
  3. 将B添加到堆栈
  4. 从堆栈弹出(所以B,因为堆栈是FILO)
  5. 第二个算法:

    1. 处理根
    2. 处理A
    3. ...处理A的孩子
    4. 处理B
    5. 您可以使用FIFO的队列实现替换堆栈,它应该没问题。