1、建立结点类
//结点
public class Node {
private String data;
private boolean isVisited;
public Node(String data) {
this.data = data;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public boolean isVisited() {
return isVisited;
}
public void setVisited(boolean isVisited) {
this.isVisited = isVisited;
}
}
2、建一个类,存储图的数据
//数据源
public class GraphData {
// 邻接矩阵
public int[][] getMatrix() {
// 1代表有边,0代表无边
int[][] matrix = { { 0, 1, 0, 1, 0, 0, 0, 0 }, { 1, 0, 1, 0, 0, 1, 0, 0 }, { 0, 1, 0, 0, 1, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 0, 1, 1 }, { 0, 0, 1, 0, 0, 1, 0, 0 }, { 0, 1, 0, 0, 1, 0, 0, 0 },
{ 0, 0, 0, 1, 0, 0, 0, 0 }, { 0, 0, 0, 1, 0, 0, 0, 0 } };
return matrix;
}
// 顶点标签
public String[] getNodeData() {
String[] nodeData = { "A", "B", "C", "D", "E", "F", "G", "H" };
return nodeData;
}
}
3、深度优先遍历算法
//深度优先遍历
import java.util.ArrayList;
import java.util.List;
public class DepthFirstTraverse {
private List<Node> list = new ArrayList<Node>();
public void depthFirstTraverse(int nodeIndex) {
GraphData gd = new GraphData();
// 邻接矩阵
int[][] matrix = gd.getMatrix();
// 顶点数据
String[] nodeData = gd.getNodeData();
// 结点列表
for (String data : nodeData) {
list.add(new Node(data));
}
// 取得传进来的结点下标对应的结点
Node node = list.get(nodeIndex);
// 打印传进来的结点
System.out.print(node.getData() + " ");
// 标记为已访问
node.setVisited(true);
// 通过邻接矩阵判断当前结点是否与其他顶点有连接
for (int i = 0; i < matrix.length; i++) {
int weight = matrix[nodeIndex][i];
// 若有边
if (weight != 0) {
// 判断该点是否被访问过
if (list.get(i).isVisited()) {
// 若被访问过,则pass掉,continue进入到下一次循环
continue;
} else {
// 若没被访问过,则调用当前函数进行递归
depthFirstTraverse(i);
}
} else {
// 没有边,continue进入到下一次循环
continue;
}
}
}
}
4、测试
public class Test {
public static void main(String[] args) {
DepthFirstTraverse dft = new DepthFirstTraverse();
dft.depthFirstTraverse(0);
}
}
5、测试输出结果