图的深度优先遍历和广度优先遍历(Java)

建立图的邻接矩阵:

package com.answer.tu;

public class DFSBFS {
    private char[] mVexs;//顶点集合
    private int[][] mMatrix;//邻接矩阵
    public DFSBFS(char[] vexs, char[][] edges){
        int vlen=vexs.length;
        int elen=edges.length;
        mVexs=new char[vlen];
        for(int i=0;i<vlen;i++){
            mVexs[i]=vexs[i];
        }
        mMatrix=new int[vlen][vlen];
        for(int i=0;i<elen;i++){

            int pos1=getPos(edges[i][0]);
            int pos2=getPos(edges[i][1]);
            mMatrix[pos1][pos2]=1;
        }
    }
    private int getPos(char c) {

        for(int i=0;i<mVexs.length;i++){
            if(mVexs[i]==c){
                return i;
            }
        }return -1;
    }

    private int nextVertex(int i, int w) {//返回其余的邻接点
        for(int j=w+1;j<mVexs.length;j++){//i:H,j:H
            if(mMatrix[i][j]==1){
                return j;
            }
        }return -1;

    }

    private int firstVertex(int i) {//返回第一个邻接节点

        for(int j=0;j<mVexs.length;j++){
            if(mMatrix[i][j]==1){
                return j;
            }
        }return -1;
    }
    
    public void print(){
        for(int i=0;i<mMatrix.length;i++){
            for(int j=0;j<mMatrix[i].length;j++){
                System.out.print(mMatrix[i][j]+" ");
            }
            System.out.println();
        }
    }
    public static void main(String[] args) {
        
        char[] vexs = {'A', 'B', 'C', 'D','E','F','G','H','I'};
        char[][] edges = new char[][]{
                {'A', 'B'},
                {'A', 'F'},
                {'B', 'G'},
                {'B', 'C'},
                {'B', 'I'},
                {'C', 'B'},
                {'C', 'I'},
                {'C', 'D'},
                {'D', 'C'},
                {'D', 'I'},
                {'D', 'G'},
                {'D', 'H'},
                {'D', 'E'},
                {'E', 'H'},
                {'E', 'F'},
                {'F', 'G'},
                {'F', 'A'},
                {'F', 'E'},
                {'G', 'H'},
                {'G', 'D'},
                {'G', 'B'},
                {'H', 'G'},
                {'H', 'D'},
                {'H', 'E'},
                {'I', 'B'},
                {'I', 'C'}

        };
        DFSBFS pG;
        pG = new DFSBFS(vexs, edges);
        pG.print();   
        pG.DFS();    
        pG.BFS();
    }
}

深度优先遍历:

每次访问完当前节点后首先访问当前节点的第一个邻接节点;

public void DFS(){
        boolean[] visited=new boolean[mVexs.length];
        System.out.println("DFS:");
        for(int i=0;i<mVexs.length;i++){
            if(visited[i]==false){
                DFS(i,visited);
            }
        }
        System.out.println();
    }

    private void DFS(int i, boolean[] visited) {
        visited[i]=true;
        System.out.print(" "+mVexs[i]);
        int w=firstVertex(i);//i:A,w:B
        while(w>=0){
            if(visited[w]==false){
                DFS(w,visited);
            }
            w=nextVertex(i,w);
        }
        i--;//回退
    }

广度优先遍历:

按层遍历;

public void BFS(){
        int head=0;
        int rear=0;
        int[] queue=new int[this.mVexs.length];
        boolean[] visited=new boolean[this.mVexs.length];
        for (int i = 0; i < mVexs.length; i++){//初始化访问标记
            visited[i] = false;
        }
        System.out.println("BFS:");
        for(int i=0;i<mVexs.length;i++){
            if(visited[i]==false){
                visited[i]=true;
                System.out.print(" "+mVexs[i]);
                queue[rear++]=i;
            }
            while(head!=rear){
                int j=queue[head++];
                int k=firstVertex(j);
                while(k>=0){
                    if(visited[k]==false){
                        visited[k]=true;
                        System.out.print(" "+mVexs[k]);
                        queue[rear++]=k;
                    }
                    k=nextVertex(j,k);
                }
            }
        }

    }

 

深度优先遍历广度优先遍历的两种常见遍历算法。 深度优先遍历(DFS)是一种递归算法,它从中的某个节点开始,首先访问该节点,然后遍历该节点的所有邻接节点,再依次对每个邻接节点进行深度优先遍历。换句话说,DFS会沿着的一条路径一直往下遍历,直到遇到没有未访问过的邻接节点为止,再返回上一级节点继续遍历其他未访问过的节点。DFS的实现一般使用递归或栈来保存待访问节点。 广度优先遍历(BFS)是一种队列的算法,它从中的某个节点开始,首先访问该节点,然后遍历该节点的所有邻接节点,并将这些邻接节点加入队列中。接下来从队列中取出一个节点,再依次遍历该节点的邻接节点,并将未访问过的邻接节点加入队列中,如此往复直到队列为空。BFS的实现一般使用队列来保存待访问节点。 在视频中,可以演示通过的邻接矩阵或邻接表的形式来表示,并使用Java代码来实现深度优先遍历广度优先遍历。对于深度优先遍历,可以从中的某个节点开始递归地遍历它的邻接节点,并使用一个标记数组来记录节点是否已经访问过。对于广度优先遍历,可以使用一个队列来按照广度优先的顺序遍历中的节点,并同样使用标记数组来记录节点是否已经访问过。 通过这个视频,观众可以了解到深度优先遍历广度优先遍历的原理实现方法,并通过代码示例更好地理解其过程。这些算法在遍历、路径查找等问题中应用广泛,对于理解解决相关问题具有重要意义。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dream答案

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值