Java 深度优先搜索输出错误

Java 深度优先搜索输出错误,java,graph,depth-first-search,breadth-first-search,Java,Graph,Depth First Search,Breadth First Search,我编写了下面的代码,使用深度优先搜索遍历上面的图形,得到的输出是01 3 6 4 5 2 我想用DFS检查它是否是正确的遍历,如果不是,什么是正确的遍历。另外,我需要在代码中加入哪些更改以获得正确的输出 public void DFSTraversal() { int v; int vFirst = 0; Stack<Integer> st = new Stack<Integer>(); Boolean[] visited = new B

我编写了下面的代码,使用深度优先搜索遍历上面的图形,得到的输出是01 3 6 4 5 2

我想用DFS检查它是否是正确的遍历,如果不是,什么是正确的遍历。另外,我需要在代码中加入哪些更改以获得正确的输出

public void DFSTraversal()
{

    int v;
    int vFirst = 0;
    Stack<Integer> st = new Stack<Integer>();
    Boolean[] visited = new Boolean[vert];
    for(int j = 0 ; j < vert ; j++ )
    {
        visited[j] = false;
    }

    // st is a stack
    st.push(vFirst);

    while(!st.isEmpty())
    {
        v = st.peek();
        if(!visited[v])
        {
            System.out.printf("%d " , +v);
            visited[v]=true;
        }

            for (int i = 0; i < vert; i++)
            {
                if ((matrix[v][i] == 1) && (!visited[i]))
                {
                    st.push(i);
                    visited[i] = true;
                    System.out.printf("%d ", +i);
                    v = i;
                }
            }

            st.pop();
    }
您应该在从堆栈中弹出元素时打印输出。如果在for循环中打印它,在该循环中检查当前节点的所有相邻节点,它将成为广度优先搜索BFS而不是DFS

编辑:


添加了完整代码。

从图片中,假设顶点的边按其指向的节点的顺序递增,正确的输出为:0 1 3 6 2 4 5

您遇到的问题是,您混合了一种动态编程方法和堆栈,以及一种迭代方法,在所有顶点上重写for循环。如果一个顶点到另一个顶点的边的索引比它自己的索引低,那么它不会立即访问该节点,而是求助于堆栈;具有未访问边的第一条边的最后一个顶点

您只需要使用动态编程方法来解决这个问题,然后通过边缘向后循环,如果它们未被访问,则将它们推到堆栈上。这会将边保留到堆栈顶部值最低的顶点,以便在下一次迭代中访问

然后,深度优先搜索循环变为:

while (!st.isEmpty()) {
  int vertex = st.pop();
  if (!visited[vertex]) {
    System.out.printf("%d ", vertex);
    visited[vertex] = true;

    for (int i = numVertices - 1; i >= 0; --i) {
      if (edges[vertex][i] == 1 && !visited[i]) {
        st.push(i);
      }
    }
  }
}
这样,您只使用while循环中的单个循环,它会不断从堆栈中弹出。访问顶点时,它会将其所有未访问和连接的顶点按相反顺序推送到堆栈上。这意味着顶点的编号最低的子级是下一个要访问的子级。如果顶点被访问且在堆栈中较深,则再次访问时将忽略该顶点,因为其子顶点也将被访问


然后,通过将堆栈设为队列并按递增顺序添加顶点,即可将此更改为“面包优先搜索”。

将代码粘贴到某个在线编辑器并发送链接如果根据您的评论修改了我的代码,我得到的输出为0 1 3 6 2。元素4和5永远不会被推入堆栈。而!st.isEmpty{v=st.pop;//System.out.printlnppopped+v;if!已访问[v]{System.out.printf%d,+v;已访问[v]=true;}对于int i=0;i public void DFSTraversal() { int v; int vFirst = 0; Stack<Integer> st = new Stack<Integer>(); Boolean[] visited = new Boolean[vert]; for (int j = 0; j < vert; j++) { visited[j] = false; } // st is a stack st.push(vFirst); while (!st.isEmpty()) { v = st.pop(); if (!visited[v]) { System.out.printf("%d ", +v); visited[v] = true; } for (int i = 0; i < vert; i++) { if ((matrix[v][i] == 1) && (!visited[i])) { st.push(i); } } } }
while (!st.isEmpty()) {
  int vertex = st.pop();
  if (!visited[vertex]) {
    System.out.printf("%d ", vertex);
    visited[vertex] = true;

    for (int i = numVertices - 1; i >= 0; --i) {
      if (edges[vertex][i] == 1 && !visited[i]) {
        st.push(i);
      }
    }
  }
}