Java深度优先搜索遍历迭代和递归无效

问题描述 投票:0回答:1

为什么这个不起作用?

V是折点数-我正在从文本文件中读取图形-S是要开始的顶点-始终设置为1

我试图以迭代和递归的形式显示图形[img下面],出于某种原因,我得到了两个完全不同的输出!

public void DF_iteration(int s) {
        // Create a stack for DFS 
        Stack<Integer> stack = new Stack<>(); 

        // Push the current source node 
        stack.push(s); 

        // variables
        id = 0;

        // Initially mark all vertices as not visited 
        for (int v = 1; v <= V; ++v) {
            visited[v] = 0;
        }

        while(!stack.isEmpty()) { 
            // Pop a vertex from stack and print it 
            int v = stack.pop(); 

            // Stack may contain same vertex twice. So 
            // we need to print the popped item only 
            // if it is not visited. 
            if(visited[v] == 0) { 
                visited[v] = ++id;
                System.out.println("DF just visited vertex " + toChar(v));

                for (int u = 1; u <= V; ++u) {
                    if (visited[u] == 0) {
                        stack.push(u);
                    }
                }
            }                
        } 
    }
Output
DF just visited vertex A
DF just visited vertex K
DF just visited vertex J
DF just visited vertex I
DF just visited vertex H
DF just visited vertex G
DF just visited vertex F
DF just visited vertex E
DF just visited vertex D
DF just visited vertex C
DF just visited vertex B
Recursion
public void DF(int s) {
        id = 0;

        for (int v = 1; v <= V; ++v) {
            visited[v] = 0;
        }

        dfVisit(0, s);
    }

    public void dfVisit(int prev, int v) {
        visited[v] = ++id;

        System.out.println("Visited vertex " + toChar(v));    

        for (int u = 1; u <= V; ++u) {
            if (visited[u] == 0) {
                    dfVisit(v, u);
            }
        }
    }
Output
Visited vertex A
Visited vertex B
Visited vertex C
Visited vertex D
Visited vertex E
Visited vertex F
Visited vertex G
Visited vertex H
Visited vertex I
Visited vertex J
Visited vertex K

这是图形graph

这是我正在尝试为迭代和递归执行的伪代码enter image description hereenter image description here这是adj和访问过的]

// adj[] is the adjacency lists array
private Node[] adj;

// used for traversing graph
private int[] visited;
java recursion iteration depth-first-search
1个回答
0
投票

您不应将每个顶点的邻接都作为伪代码访问]

获得邻接点到顶点。

具有堆栈的第一个将从V-1到1

,但是第二个将从1变为V-1

© www.soinside.com 2019 - 2024. All rights reserved.