图的深度优先遍历

主要实现图的两种形式的深度优先遍历,深度优先遍历类似于二叉树的先序遍历。但是因为图可能有多个连通分量,即可能不是连接在一起的,有的顶点可能和其他顶点都没有连接,所有需要依次访问每个顶点,然后对顶点做先序遍历。但由于图的顶点不止有两个孩子,所以采用while循环的方法

1.邻接矩阵的深度优先遍历

数据结构:

public class Graph {
    String[] vertex = new String[5];    //顶点类型可自定义
    int[][] edge = new int[5][5];       //边的类型可自定义
   //省略get.set方法}
public class DFSTraverseGraph {
    public static boolean[] visited = new boolean[5];   //假定顶点数为5

    /**
     * 邻接矩阵的深度优先遍历
     *
     * 类似于二叉树的先序遍历
     * 因为图可能有多个连通分量  一次遍历一个连通分量
     * @param g
     */
    public static void dfsTraverseGraph(Graph g){

        //初始化所有顶点状态都是未访问状态
        for(int i = 0; i < 5; i++){
            visited[i] = false;
        }

        for(int i = 0; i < g.getVertex().length; i++){
            if(!visited[i]){
                dfs(g, i);
            }
        }
    }

    private static void dfs(Graph g, int index){
        int col = g.getVertex().length;   //矩阵的列数,也就是顶点数
        visited[index] = true;      //把该顶点状态设为访问过
        System.out.println("顶点信息:" + g.getVertex()[index]);//输出顶点信息
        for(int j = 0; j < col; j++){
            int[][] edge = g.getEdge();
            if(edge[index][j] == 1 && !visited[j]){
                dfs(g, j);
            }
        }
    }

}

2.邻接表的深度优先遍历

数据结构:

public class AdjacentTable {
    private static final int MAX_SIZE = 100;        //能存放的最大顶点数
    private VertexNode[] vertexNodes = new VertexNode[MAX_SIZE];   //存放顶点的数组
    private int vertexNum;      //顶点数   不能超过能存放顶点数的最大值
    private int edgeNum;          //边数   不能超过无向图的最大边数 即  n(n-1)/2   n为顶点数
//省略get.set方法}
public class VertexNode {
    private String data;   //存放顶点结点信息   比如名称
    private EdgeNode firstEdge;  //指向与该结点相连的 顶点集合 的第一个结点
//省略get.set方法}
public class EdgeNode {
    private int adjvex;  //存放该顶点在顶点列表中的下标(位置)
    private int weight;  //权值  对于非网图可以不需要  所谓网图:就是带权的图
    private EdgeNode next; //下一个邻接点

//省略get.set方法}

public class DFSTraverseGraph {
    public static boolean[] visited = new boolean[5];   //假定顶点数为5

    /**
     * 邻接表的深度优先遍历
     * 因为图可能有多个连通分量  一次遍历一个连通分量
     * @param g
     */
    public static void dfsTraverseGraphByAdjacentTable(AdjacentTable g){

        /**
         * 初始化顶点状态为未访问状态
         */
        for(int i = 0; i < visited.length; i++){
            visited[i] = false;
        }

        for(int i = 0; i < g.getVertexNum(); i++){
            if(!visited[i]){
                dfsAdjacentTable(g, i);
            }
        }
    }

    private static void dfsAdjacentTable(AdjacentTable g, int index){
        visited[index] = true;
        System.out.println("输出顶点信息:" + g.getVertexNodes()[index].getData());
        EdgeNode node = g.getVertexNodes()[index].getFirstEdge();
        while( node != null){
            if(!visited[node.getAdjvex()]){
                dfsAdjacentTable(g, node.getAdjvex());
            }
            node = node.getNext();
        }
    }


}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值