JAVA-图的深度优先遍历

来源:互联网 发布:levis淘宝推荐店铺 编辑:程序博客网 时间:2024/06/05 15:15

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、测试输出结果
这里写图片描述