原文链接https://blog.csdn.net/Gamer_gyt/article/details/51498546
import com.sun.javafx.geom.Edge;
import com.sun.org.apache.xerces.internal.dom.DeepNodeListImpl;
import java.util.Scanner;
//定义图结构
class Graph{
static final int MaxNum = 20;
static final int MaxValue = 65535;
static Scanner scan = new Scanner(System.in);
char[] Vertex = new char[MaxNum]; // 定义数组 保存节点信息 vertex是顶点最高点意思
int GType; //图的类型 有向图和无向图
int VertexNum; //顶点数量
int EdgeNum; //变的数量
int[][] EdgeWeight = new int[MaxNum][MaxNum]; //定义矩阵保存顶点信息
int[] isTrave = new int[MaxNum]; //遍历标志
//创建邻接矩阵图
static void createGraph(Graph g){
char EstartV,EndV;
int weight;
int i,j;
System.out.println("开始输入各顶点信息啦");
System.out.println();
System.out.println("先输入所有的节点");
for(i=0;i<g.VertexNum;i++){
System.out.println("第"+(i+1)+"个顶点");
// Scanner scan = new Scanner(System.in);
g.Vertex[i] = (scan.next().toCharArray())[0]; //不是很懂
}
System.out.println("再输入所有边的权值");
for (int k=0;k< g.EdgeNum;k++){
System.out.println("第"+(k+1)+"条边");
EstartV = scan.next().charAt(0);
EndV = scan.next().charAt(0);
weight = scan.nextInt();
for(i=0;EstartV!=g.Vertex[i];i++);//在已有顶点中查找开始节点
for (j=0;EndV!=g.VertexNum;j++);//在已有顶点中查找结束节点
g.EdgeWeight[i][j] = weight; //对应位置保存权重,表示有一条边
if(g.GType==0){ //如果是无向图 反过来在存一个
g.EdgeWeight[j][i] = weight;
}
} ///这儿运行时候有问题,,,第二条,第三条边出不来;
}
//清空图
static void clearGraph(Graph g){
int i,j;
for(i=0;i<g.VertexNum;i++){
for(j=0;j<g.VertexNum;j++){
g.EdgeWeight[i][j] = Graph.MaxValue;
}
}
}
//输出邻接矩阵
static void OutGraph(Graph g){
int i,j;
for(j=0;j<g.VertexNum;j++){
System.out.println("\t"+g.Vertex[j]);
}System.out.println();
for(i=0;i<g.VertexNum;i++){
System.out.println(g.Vertex[i]);
for(j=0;j<g.VertexNum;j++){
if(g.EdgeWeight[i][j] == Graph.MaxNum)
System.out.println("\t Z");
else{
System.out.println( "\t "+g.EdgeWeight[i][j]);
}
System.out.println();
}
}
}
//(被深度搜索调用的函数)
static void DeepTraOne(Graph g,int n){//从第n个节点开始遍历
int i;
g.isTrave[n] = 1; //从第n个开始,标明第n个已经遍历过了
System.out.println("---->"+g.Vertex[n]);
for(i=0;i<g.VertexNum;i++){
if(g.EdgeWeight[n][i] !=g.MaxValue && g.isTrave[i]==0){
DeepTraOne(g,i);
}
}
}
//深度优先遍历
static void DeepTraGraph(Graph g){
int i;
for(i=0;i<g.VertexNum;i++){ //先把所有的初始化一下 不要待会乱掉了
g.isTrave[i] = 0;
}
System.out.println("深度优先遍历0");
for(i=0;i<g.VertexNum;i++){
if(g.isTrave[i]==0) //若没有被输出过
DeepTraOne(g,i);
}
System.out.println();
}
}
class test{
public static void main(String[] args) {
Graph g = new Graph();
Scanner scan = new Scanner(System.in);
System.out.println("输出生成图的类型");
g.GType =scan.nextInt();
System.out.println("输入图定点数量");
g.VertexNum = scan.nextInt();
System.out.println("输入边的数量");
g.EdgeNum = scan.nextInt();
g.clearGraph(g); //清空图
g.createGraph(g); //生成邻接表结构的图
System.out.println("该图的邻接矩阵数据如下:");
g.OutGraph(g); //输出图
g.DeepTraGraph(g); //深度优先遍历图
}
}
好像终于知道图的深度优先遍历的写法了,,在一个函数中调用另一个函数这种逻辑简单易懂,,但是运行的时候还有些问题,,