深度優(yōu)先與廣度優(yōu)先Java實現(xiàn)代碼示例
在編程生活中,我們總會遇見樹性結(jié)構(gòu),這幾天剛好需要對樹形結(jié)構(gòu)操作,就記錄下自己的操作方式以及過程?,F(xiàn)在假設(shè)有一顆這樣樹,(是不是二叉樹都沒關(guān)系,原理都是一樣的)

1、深度優(yōu)先
英文縮寫為DFS即Depth First Search.
深度優(yōu)先搜索是一種在開發(fā)爬蟲早期使用較多的方法。它的目的是要達到被搜索結(jié)構(gòu)的葉結(jié)點(即那些不包含任何超鏈的HTML文件) 。在一個HTML文件中,當(dāng)一個超鏈被選擇后,被鏈接的HTML文件將執(zhí)行深度優(yōu)先搜索,即在搜索其余的超鏈結(jié)果之前必須先完整地搜索單獨的一條鏈。深度優(yōu)先搜索沿著HTML文件上的超鏈走到不能再深入為止,然后返回到某一個HTML文件,再繼續(xù)選擇該HTML文件中的其他超鏈。當(dāng)不再有其他超鏈可選擇時,說明搜索已經(jīng)結(jié)束。其過程簡要來說是對每一個可能的分支路徑深入到不能再深入為止,而且每個節(jié)點只能訪問一次。對于上面的例子來說深度優(yōu)先遍歷的結(jié)果就是:A,B,D,E,I,C,F,G,H.(假設(shè)先走子節(jié)點的的左側(cè))。
深度優(yōu)先遍歷各個節(jié)點,需要使用到堆(Stack)這種數(shù)據(jù)結(jié)構(gòu)。stack的特點是是先進后出。整個遍歷過程如下:
首先將A節(jié)點壓入堆中,stack(A);
將A節(jié)點彈出,同時將A的子節(jié)點C,B壓入堆中,此時B在堆的頂部,stack(B,C);
將B節(jié)點彈出,同時將B的子節(jié)點E,D壓入堆中,此時D在堆的頂部,stack(D,E,C);
將D節(jié)點彈出,沒有子節(jié)點壓入,此時E在堆的頂部,stack(E,C);
將E節(jié)點彈出,同時將E的子節(jié)點I壓入,stack(I,C);
...依次往下,最終遍歷完成,Java代碼大概如下:
public void depthFirst() {
Stack<Map<String, Object>> nodeStack = new Stack<Map<String, Object>>();
Map<String, Object> node = new HashMap<String, Object>();
nodeStack.add(node);
while (!nodeStack.isEmpty()) {
node = nodeStack.pop();
System.out.println(node);
//獲得節(jié)點的子節(jié)點,對于二叉樹就是獲得節(jié)點的左子結(jié)點和右子節(jié)點
List<Map<String, Object>> children = getChildren(node);
if (children != null && !children.isEmpty()) {
for (Map child : children) {
nodeStack.push(child);
}
}
}
}
//節(jié)點使用Map存放
2、廣度優(yōu)先
英文縮寫為BFS即Breadth FirstSearch。其過程檢驗來說是對每一層節(jié)點依次訪問,訪問完一層進入下一層,而且每個節(jié)點只能訪問一次。對于上面的例子來說,廣度優(yōu)先遍歷的 結(jié)果是:A,B,C,D,E,F,G,H,I(假設(shè)每層節(jié)點從左到右訪問)。
廣度優(yōu)先遍歷各個節(jié)點,需要使用到隊列(Queue)這種數(shù)據(jù)結(jié)構(gòu),queue的特點是先進先出,其實也可以使用雙端隊列,區(qū)別就是雙端隊列首位都可以插入和彈出節(jié)點。整個遍歷過程如下:
首先將A節(jié)點插入隊列中,queue(A);
將A節(jié)點彈出,同時將A的子節(jié)點B,C插入隊列中,此時B在隊列首,C在隊列尾部,queue(B,C);
將B節(jié)點彈出,同時將B的子節(jié)點D,E插入隊列中,此時C在隊列首,E在隊列尾部,queue(C,D,E);
將C節(jié)點彈出,同時將C的子節(jié)點F,G,H插入隊列中,此時D在隊列首,H在隊列尾部,queue(D,E,F(xiàn),G,H);
將D節(jié)點彈出,D沒有子節(jié)點,此時E在隊列首,H在隊列尾部,queue(E,F(xiàn),G,H);
...依次往下,最終遍歷完成,Java代碼大概如下:
public void breadthFirst() {
Deque
總結(jié)
以上就是本文關(guān)于深度優(yōu)先與廣度優(yōu)先Java實現(xiàn)代碼示例的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
相關(guān)文章
java.util.NoSuchElementException原因及兩種解決方法
本文主要介紹了java.util.NoSuchElementException原因及兩種解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
Java 內(nèi)省(Introspector)深入理解
這篇文章主要介紹了Java 內(nèi)省(Introspector)深入理解的相關(guān)資料,需要的朋友可以參考下2017-03-03
如何在IDEA上安裝scala插件并創(chuàng)建工程(圖文教程)
這篇文章主要介紹了一文教你如何在IDEA上安裝scala插件并創(chuàng)建工程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07
SpringBoot詳細(xì)探究講解默認(rèn)組件掃描
在項目中我們創(chuàng)建了Controller,這個Controller是如何被spring自動加載的呢?為什么Controller必須放在啟動類的同級目錄下呢2022-06-06

