數據結構系列是我學習做的筆記,會持續更新,源碼分享在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
}
}
}
}