Java 图深度优先搜索有时有效,有时无效';T

Java 图深度优先搜索有时有效,有时无效';T,java,data-structures,graph,depth-first-search,Java,Data Structures,Graph,Depth First Search,因此,我编写了一个Graph类,但似乎无法根据节点的顺序正确地对其进行深度优先搜索。我的意思是: 如果我的图表如下所示: A-B-D |/ C int nextNode = this.getUnvisitedAdjacentNode(stack.peek().index); DFS返回:“ABC” 但当它看起来像这样时: A-B | | D C | E 它将正确打印ABCDE 我发现的问题在于getUnvisitedAdjacentNode()函数。以下是函数: public in

因此,我编写了一个Graph类,但似乎无法根据节点的顺序正确地对其进行深度优先搜索。我的意思是:

如果我的图表如下所示:

A-B-D
|/
C
int nextNode = this.getUnvisitedAdjacentNode(stack.peek().index);
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;
}
public int getUnvisitedAdjacentNode(int n){
for(int i=0;i
问题是,我发现它是按“顺序”运行的(只是一个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;
    }
}
public void depthFirstTraverse(){
堆栈=新堆栈();
nodeList.get(0).wasvisted=true;
System.out.println(nodeList.get(0.item));
stack.push(nodeList.get(0));
而(!stack.isEmpty()){
int nextNode=this.getUnvisitedAdjacentNode(stack.peek().index);
如果(下一个节点==-1){
stack.pop();
}否则{
nodeList.get(nextNode.wasvisted=true;
System.out.println(nodeList.get(nextNode.item));
stack.push(nodeList.get(nextNode));
}
}
对于(int i=0;i
你说对了。如果从堆栈中弹出一个节点,则需要首先确保其所有未访问的邻居都在堆栈中。否则,无法保证每个人都会被访问

例如,在您给出的第一个图中,如果先访问节点A,然后访问节点B,那么接下来将访问节点C或D。但是,如果只将其中一个推到堆栈上,然后移除B,则无法到达最后一个


因此,您可能想做的是编写一个函数getAllInvisitedAdjacentNodes,并在弹出之前将它们全部推到堆栈上。

幸运的是,我发现了自己的错误,上面的代码都是正确的,只是代码中没有粘贴

如果有人关心的话,问题在于我完全无视ArrayList有一个“IndexOf()”方法的事实(我知道这很愚蠢),决定将我自己的“index”字段破解到我的节点类中。在处理我自己的索引时,我有一个小错误,它破坏了遍历

因此,我的DFS算法中的旧行如下所示:

A-B-D
|/
C
int nextNode = this.getUnvisitedAdjacentNode(stack.peek().index);
但它应该是:

int nextNode = this.getUnvisitedAdjacentNode(this.nodeList.indexOf(stack.peek()));

@转向。不知道你的意思。他不会推送任何已访问的邻居,但会在推送每个邻居之前弹出节点。所以情况就这样了是的,布莱恩,我检查了我所有的邻居。仔细看。代码现在可以工作了。检查我发布的更新解决方案。很抱歉浪费时间。我将节点标记为已访问,然后推送它。然后我继续前进,访问相邻的节点,将其标记为已访问并推送。如果我到达一个没有任何相邻节点的叶节点,我会在堆栈上向后移动,弹出已访问的节点并继续移动到相邻节点,以此类推。抱歉@Briankocloski:-p只有在没有其他邻居可访问时,他才会弹出。啊,抱歉。我没注意到。很高兴你明白了