所以我写了一个 Graph 类,我似乎无法根据节点的顺序正确地对其进行深度优先搜索。这就是我的意思:
如果我的图表如下所示:
A-B-D
|/
C
DFS 返回:“ABC”
但是当它看起来像这样时:
A-B
| |
D C
|
E
它将正确打印 ABCDE。
我发现的问题在于我的 getUnvisitedAdjacentNode() 函数。这是功能:
public int getUnvisitedAdjacentNode(int n) {
for (int i = 0; i < this.nodeList.size(); i++) {
if (this.edges[n][i] == 1 && this.nodeList.get(i).wasVisited == false) {
return i;
}
}
return -1;
}
我发现的问题是因为它按“顺序”进行(只是一个 for 循环),在第一种情况下它永远不会遍历 D,因为 B 被访问并且在 C 被访问后,B 只是从堆栈中弹出. 也许这不是问题。
这是我实际的 DFS 遍历的代码。
public void depthFirstTraverse() {
Stack<Node> stack = new Stack<Node>();
nodeList.get(0).wasVisited = true;
System.out.println(nodeList.get(0).item);
stack.push(nodeList.get(0));
while (!stack.isEmpty()) {
int nextNode = this.getUnvisitedAdjacentNode(stack.peek().index);
if (nextNode == -1) {
stack.pop();
} else {
nodeList.get(nextNode).wasVisited = true;
System.out.println(nodeList.get(nextNode).item);
stack.push(nodeList.get(nextNode));
}
}
for (int i = 0; i < nodeList.size(); i++) {
nodeList.get(i).wasVisited = false;
}
}