Depth First Search导致StackOverFlowError

时间:2015-08-17 23:58:08

标签: java static-methods depth-first-search

我有一项任务,我必须通过有向图创建运行深度优先搜索,并将遍历作为链接列表返回。我相信DFS的代码是正确的,因为它似乎与教科书相匹配,并且当我走过步骤时它是有道理的。如果我在每个顶点被标记时将其打印出来,它会使打印机一遍又一遍地导致堆栈溢出错误。

 private static boolean[] marked;
 private static LinkedList<Integer> ret;

 public static LinkedList<Integer> dfs(Digraph g, int s) {

     marked = new boolean[g.V()];

    ret = new LinkedList<>();

    marked[s] = true;
    System.out.print(s);

    ret.add(s);



   for (int i : g.adj(s)) {
       if (!marked[i]) {
          dfs(g, i);

     }
   }

   return ret;
  }

我的猜测是每次调用dfs时都会重置boolean []。我试过把它放在方法之外,但因为方法是静态的,我不能改变它(给定赋值参数),我得到一个静态非静态问题,我不太确定如何解决。

1 个答案:

答案 0 :(得分:2)

是的,你的问题确实是因为布尔值在某种意义上被重置了。重置发生在这一行:

marked = new boolean[g.V()];

在这一行中,您将在新函数调用中创建一个新的布尔数组,该数组与原始数组不同。然后,您正在检查不包含旧数组更改的新数组。

我建议您创建一个初始化dfs进程的包装函数,然后将数组传递给dfs函数的每次调用。

如果您不想添加额外的参数,只需在方法之外创建一个静态变量:

private static boolean[] marked;

然后在适当时初始化