首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >迭代DFS中的奇数排序与递归DFS

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

Stack Overflow用户
提问于 2011-10-07 06:05:11
回答 2查看 2.3K关注 0票数 2

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

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

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

迭代DFS:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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

这是怎么回事?为什么消除递归会改变访问节点的顺序?

->Full code on a Netbeans project.

EN

回答 2

Stack Overflow用户

发布于 2012-10-16 20:03:24

检查你的graph.adjacencies.get(V),这两种情况下他们给你的回复是一样的吗?如果是这样,那么递归调用和堆栈调用将产生不同的结果。例如,如下所示的树:

代码语言:javascript
复制
      1
    2   3
  4

堆栈版本的顺序为1->3->2->4,递归版本的顺序为1->2->4->3,假设graph.adjacencies.get(V)总是首先返回左子对象。

票数 3
EN

Stack Overflow用户

发布于 2011-10-07 23:26:07

因为有了堆栈。它是First- in,Last-Out,因此您将按照将节点的子节点添加到堆栈的相反顺序来查看它们。

假设根的两个孩子是A和B,按照这个顺序(从左到右)。

第一种算法:

  1. 句柄根
  2. 将A添加到堆栈
  3. 将B添加到堆栈
  4. 从堆栈中弹出(因此是B,因为堆栈是FILO)

第二种算法:

  1. Handle root
  2. Handle A
  3. ...handle A's kids
  4. Handle B

(处理A的孩子和处理B)

你可以用一个先进先出的队列实现替换你的Stack,它应该没问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7681025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档