深度优先搜索的java实现
下面的代码没有错误,但是我得到的输出不正确深度优先搜索的java实现,java,arrays,data-structures,depth-first-search,Java,Arrays,Data Structures,Depth First Search,下面的代码没有错误,但是我得到的输出不正确 import java.io.*; class dfs { static void dfs(int a[][], int m[], int i, int n) { int j; System.out.println("\t" + (i+1)); m[i] = 1; for(j=0; j<n; j++) if(a[i][j]==1 && m[j]==0) dfs(a,m,j,n); } public st
import java.io.*;
class dfs
{
static void dfs(int a[][], int m[], int i, int n)
{
int j;
System.out.println("\t" + (i+1));
m[i] = 1;
for(j=0; j<n; j++)
if(a[i][j]==1 && m[j]==0)
dfs(a,m,j,n);
}
public static void main(String args[]) throws IOException
{
int n, i, j;
System.out.println("No. of vertices : ");
BufferedReader br= new BufferedReader (new InputStreamReader(System.in));
n =Integer.parseInt(br.readLine());
int m[]= new int[n];
int a[][] = new int[n][n];
for (i=0; i<n; i++)
{
m[i] = 0;
}
System.out.println("\n\nEnter 1 if edge is present, 0 if not");
for (i=0; i<n; i++)
{
System.out.println("\n");
for (j=i; j<n; j++)
{
System.out.println("Edge between " + (i+1) + " and " + (j+1)+ " : ");
a[i][j] =Integer.parseInt(br.readLine());
a[j][i]=a[i][j];
}
a[i][i] = 0;
}
System.out.println("\nOrder of accessed nodes : \n");
for (i=0; i<n; i++)
if (m[i]==0)
dfs(a,m,i,n);
}
}
DFS路径应为:1 2 4 8 5 3 6 7
我得到的结果是:1 2 4 8 5 6 3 7
请注意,第6项和第7项是互换的
谁能告诉我如何更正此问题。谢谢您的帮助您得到的输出对于无向图是正确的。您提供的边列表包括(6,8),但DFS可以从8移动到6,也可以从6移动到8,因为它是无向的。如果你想要一个有向图,你必须对
a
数组的设置方式做一些改变。我改变了dfs的实现,现在它可以工作了,如果你使用变量的名称,使它们更容易识别,你可以更快地得到帮助
static void dfs(int adjacencyMatrix[][], int vertex, int[] visited) {
System.out.println("visiting " + (vertex + 1) );
for (int j = vertex + 1; j < adjacencyMatrix[vertex].length; j++)
if (adjacencyMatrix[vertex][j] == 1 && visited[j] == 0) {
visited[j] = 1;
dfs(adjacencyMatrix, j, visited);
}
}
static void dfs(int-adjacencyMatrix[]],int-vertex,int[]已访问){
System.out.println(“访问”+(顶点+1));
对于(int j=顶点+1;j<邻接矩阵[vertex]。长度;j++)
if(邻接矩阵[vertex][j]==1和到访[j]==0){
访问量[j]=1;
dfs(邻接矩阵,j,访问);
}
}
输出正确。在您的示例中,当dfs()中的i=4时,递归停止(在顶点5中停止),并返回到顶点8,即它的来源(i=7)。在这个调用中,我们刚刚从j=4(没有更多相邻顶点的那个)返回。循环索引是递增的(j++),因为顶点8连接到顶点6(j=5),所以下一个递归调用的i=5,所以您访问的是顶点6。从顶点6开始,递归先到3,然后到7,然后一切都返回。您可以尝试DFS的这种实现:
import java.util.ArrayList;
import java.util.List;
public class TreeTraverse {
static class Node{
Node(int data){
this.data = data;
this.left = null;
this.right = null;
this.visited = false;
}
int data;
Node left;
Node right;
boolean visited;
}
public static void main(String[] args) {
//The tree:
// 1
// / \
// 7 9
// \ / \
// 8 2 3
Node node1 = new Node(1);
Node node7 = new Node(7);
Node node9 = new Node(9);
Node node8 = new Node(8);
Node node2 = new Node(2);
Node node3 = new Node(3);
node1.left = node7;
node1.right = node9;
node7.right = node8;
node9.right = node3;
node9.left = node2;
System.out.println("DFS: ");
depthFirstSearch(node1);
}
private static void depthFirstSearch(Node node){
if(node.left == null && node.right == null){
System.out.print(node.data+" ");
node.visited = true;
}else if(node.left == null || node.left.visited){
depthFirstSearch(node.right);
System.out.print(node.data+" ");
node.visited = true;
}else{
depthFirstSearch(node.left);
node.visited = true;
System.out.print(node.data+" ");
depthFirstSearch(node.right);
}
}
}
这是它的递归实现。有关更多信息,请访问:。我希望有帮助
import java.util.ArrayList;
import java.util.List;
public class TreeTraverse {
static class Node{
Node(int data){
this.data = data;
this.left = null;
this.right = null;
this.visited = false;
}
int data;
Node left;
Node right;
boolean visited;
}
public static void main(String[] args) {
//The tree:
// 1
// / \
// 7 9
// \ / \
// 8 2 3
Node node1 = new Node(1);
Node node7 = new Node(7);
Node node9 = new Node(9);
Node node8 = new Node(8);
Node node2 = new Node(2);
Node node3 = new Node(3);
node1.left = node7;
node1.right = node9;
node7.right = node8;
node9.right = node3;
node9.left = node2;
System.out.println("DFS: ");
depthFirstSearch(node1);
}
private static void depthFirstSearch(Node node){
if(node.left == null && node.right == null){
System.out.print(node.data+" ");
node.visited = true;
}else if(node.left == null || node.left.visited){
depthFirstSearch(node.right);
System.out.print(node.data+" ");
node.visited = true;
}else{
depthFirstSearch(node.left);
node.visited = true;
System.out.print(node.data+" ");
depthFirstSearch(node.right);
}
}
}