JAVA數據結構----實現圖廣度優先遍歷與深度優先遍歷

數據結構系列是我學習做的筆記,會持續更新,源碼分享在github:數據結構,當然你也可以從下面的代碼片中獲取
注:github代碼更新會有延遲,關注不迷路😄

本篇博文簡單介紹圖廣度優先搜索算法與深度優先搜索算法,並用java實現

1. 廣度優先搜索

教科書上解釋:廣度優先搜索類似於類似於樹的層次遍歷,是數的層次遍歷的推廣

算法描述:
從圖中某個頂點v開始,先訪問該頂點,再依此訪問該頂點的每一個未被訪問的鄰接點w1,w2,w3,w4……,然後按照順序訪問頂點w1,w2……未被訪問的鄰接點,重複直到圖中頂點全被訪問。

簡要概述:選擇圖的一個頂點,自上而下,自左而右,由遠及近,一行行搜索

2. 深度優先搜索

教科書上解釋: 深度優先搜索類似於樹的先根遍歷,是樹先根遍歷的推廣

算法描述:
從圖中某個頂點v開始訪問,然後訪問他的任意一個鄰接點w1,再從w1出發,訪問與w1相鄰且還未被訪問的頂點w2……,如此直到所有的鄰接點都被訪問過,接着,回退一步,遇到前一次剛訪問的頂點,查看其是否還有未被訪問的鄰接點,若有,訪問此頂點,否則繼續回退,直到所有頂點全被訪問。

簡要概述:先從一個頂點出發,一根筋靠着左邊走,直到走不通後往後倒退,若有路,接着靠左走,如此往復,直到所有頂點全部被訪問。

3. Java實現: GraphSearch.java

其中,涉及到 IGraph 接口,詳見鏈接:
圖的存儲結構之鄰接表或者圖的存儲結構之鄰接矩陣

當然也可以訪問我的github,獲取完整項目代碼(注:更新有延遲),地址見博文開頭

package code.Graph;

import code.Queue.LinkQueue;

/**
 * 圖的搜索算法,包括廣度優先搜索算法和深度優先搜索算法
 * */
public class GraphSearch {
    private static boolean [] visited;//訪問標誌數組

    /**
     * 廣度優先遍歷----(Breadth First Search)
     * */
    public static void BFSTraverse(IGraph G)throws Exception{
        visited = new boolean[G.getVexNum()];//實例化訪問標誌數組

        for (int v = 0;v < G.getVexNum();v++){//循環 頂點次數 次
            //將訪問標誌數組初始化
            visited[v] = false;
        }

        for (int v = 0;v < G.getVexNum();v++){
            if (!visited[v]){   //頂點尚未被訪問
                BFS(G,v);
            }
        }

    }

    private static void BFS(IGraph G,int v)throws Exception{
        visited[v] = true;
        System.out.print(G.getVex(v).toString()+", ");
        LinkQueue Q = new LinkQueue();//輔助隊列Q
        Q.offer(v);

        while (!Q.isEmpty()){
            int u = (Integer)Q.poll();//隊首元素出隊列並賦值給u

            for (int w = G.firstAdjVex(u);w >= 0;w = G.nextAdjVex(u,w)){
                if (!visited[w]){   //w爲u的尚未訪問的鄰接頂點
                    visited[w] = true;
                    System.out.print(G.getVex(w).toString()+", ");
                    Q.offer(w);
                }
            }
        }
    }

    /**
     * 深度優先遍歷----(Depth First Search)
     * */
    public static void DFSTraverse(IGraph G) throws Exception{
        visited = new boolean[G.getVexNum()];//實例化訪問標誌數組

        for (int v = 0;v < G.getVexNum();v++){//循環 頂點次數 次
            //將訪問標誌數組初始化
            visited[v] = false;
        }

        for (int v = 0;v < G.getVexNum();v++){
            if (!visited[v]){   //頂點尚未被訪問
                DFS(G,v);
            }
        }
    }

    public static void DFS(IGraph G,int v)throws Exception{
        //從第v個頂點出發遞歸地深度優先遍歷圖G
        visited[v] = true;
        System.out.print(G.getVex(v).toString()+", ");//訪問第v個頂點

        for (int w = G.firstAdjVex(v);w >= 0;w = G.nextAdjVex(v,w)){
            if (!visited[w]){
                DFS(G,w);   //對v的尚未訪問的鄰接頂點w遞歸調用DFS
            }
        }
    }

}
發佈了27 篇原創文章 · 獲贊 49 · 訪問量 2259
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章