我正在解决这个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。
答案 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.
第一个算法:
第二个算法:
您可以使用FIFO的队列实现替换堆栈,它应该没问题。