最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深度優(yōu)先與廣度優(yōu)先Java實(shí)現(xiàn)代碼示例

 更新時(shí)間:2017年12月08日 09:55:17   作者:nickTimer  
這篇文章主要介紹了深度優(yōu)先與廣度優(yōu)先Java實(shí)現(xiàn)代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下。

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

1、深度優(yōu)先

英文縮寫為DFS即Depth First Search.

深度優(yōu)先搜索是一種在開發(fā)爬蟲早期使用較多的方法。它的目的是要達(dá)到被搜索結(jié)構(gòu)的葉結(jié)點(diǎn)(即那些不包含任何超鏈的HTML文件) 。在一個(gè)HTML文件中,當(dāng)一個(gè)超鏈被選擇后,被鏈接的HTML文件將執(zhí)行深度優(yōu)先搜索,即在搜索其余的超鏈結(jié)果之前必須先完整地搜索單獨(dú)的一條鏈。深度優(yōu)先搜索沿著HTML文件上的超鏈走到不能再深入為止,然后返回到某一個(gè)HTML文件,再繼續(xù)選擇該HTML文件中的其他超鏈。當(dāng)不再有其他超鏈可選擇時(shí),說明搜索已經(jīng)結(jié)束。其過程簡要來說是對每一個(gè)可能的分支路徑深入到不能再深入為止,而且每個(gè)節(jié)點(diǎn)只能訪問一次。對于上面的例子來說深度優(yōu)先遍歷的結(jié)果就是:A,B,D,E,I,C,F,G,H.(假設(shè)先走子節(jié)點(diǎn)的的左側(cè))。

深度優(yōu)先遍歷各個(gè)節(jié)點(diǎn),需要使用到堆(Stack)這種數(shù)據(jù)結(jié)構(gòu)。stack的特點(diǎn)是是先進(jìn)后出。整個(gè)遍歷過程如下:

首先將A節(jié)點(diǎn)壓入堆中,stack(A);

將A節(jié)點(diǎn)彈出,同時(shí)將A的子節(jié)點(diǎn)C,B壓入堆中,此時(shí)B在堆的頂部,stack(B,C);

將B節(jié)點(diǎn)彈出,同時(shí)將B的子節(jié)點(diǎn)E,D壓入堆中,此時(shí)D在堆的頂部,stack(D,E,C);

將D節(jié)點(diǎn)彈出,沒有子節(jié)點(diǎn)壓入,此時(shí)E在堆的頂部,stack(E,C);

將E節(jié)點(diǎn)彈出,同時(shí)將E的子節(jié)點(diǎn)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é)點(diǎn)的子節(jié)點(diǎn),對于二叉樹就是獲得節(jié)點(diǎn)的左子結(jié)點(diǎn)和右子節(jié)點(diǎn)
		List<Map<String, Object>> children = getChildren(node);
		if (children != null && !children.isEmpty()) {
			for (Map child : children) {
				nodeStack.push(child);
			}
		}
	}
}
​//節(jié)點(diǎn)使用Map存放

2、廣度優(yōu)先

英文縮寫為BFS即Breadth FirstSearch。其過程檢驗(yàn)來說是對每一層節(jié)點(diǎn)依次訪問,訪問完一層進(jìn)入下一層,而且每個(gè)節(jié)點(diǎn)只能訪問一次。對于上面的例子來說,廣度優(yōu)先遍歷的 結(jié)果是:A,B,C,D,E,F,G,H,I(假設(shè)每層節(jié)點(diǎn)從左到右訪問)。

廣度優(yōu)先遍歷各個(gè)節(jié)點(diǎn),需要使用到隊(duì)列(Queue)這種數(shù)據(jù)結(jié)構(gòu),queue的特點(diǎn)是先進(jìn)先出,其實(shí)也可以使用雙端隊(duì)列,區(qū)別就是雙端隊(duì)列首位都可以插入和彈出節(jié)點(diǎn)。整個(gè)遍歷過程如下:

首先將A節(jié)點(diǎn)插入隊(duì)列中,queue(A);

將A節(jié)點(diǎn)彈出,同時(shí)將A的子節(jié)點(diǎn)B,C插入隊(duì)列中,此時(shí)B在隊(duì)列首,C在隊(duì)列尾部,queue(B,C);

將B節(jié)點(diǎn)彈出,同時(shí)將B的子節(jié)點(diǎn)D,E插入隊(duì)列中,此時(shí)C在隊(duì)列首,E在隊(duì)列尾部,queue(C,D,E);

將C節(jié)點(diǎn)彈出,同時(shí)將C的子節(jié)點(diǎn)F,G,H插入隊(duì)列中,此時(shí)D在隊(duì)列首,H在隊(duì)列尾部,queue(D,E,F(xiàn),G,H);

將D節(jié)點(diǎn)彈出,D沒有子節(jié)點(diǎn),此時(shí)E在隊(duì)列首,H在隊(duì)列尾部,queue(E,F(xiàn),G,H);

...依次往下,最終遍歷完成,Java代碼大概如下:

public void breadthFirst() {
 Deque> nodeDeque = new ArrayDeque>();
 Map node = new HashMap();
 nodeDeque.add(node);
 while (!nodeDeque.isEmpty()) {
  node = nodeDeque.peekFirst();
  System.out.println(node);
  //獲得節(jié)點(diǎn)的子節(jié)點(diǎn),對于二叉樹就是獲得節(jié)點(diǎn)的左子結(jié)點(diǎn)和右子節(jié)點(diǎn)
  List> children = getChildren(node);
  if (children != null && !children.isEmpty()) { 
   for (Map child : children) {
    nodeDeque.add(child);
   }
  }
 }
}
//這里使用的是雙端隊(duì)列,和使用queue是一樣的

總結(jié)

以上就是本文關(guān)于深度優(yōu)先與廣度優(yōu)先Java實(shí)現(xiàn)代碼示例的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

相關(guān)文章

  • java.util.NoSuchElementException原因及兩種解決方法

    java.util.NoSuchElementException原因及兩種解決方法

    本文主要介紹了java.util.NoSuchElementException原因及兩種解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Java 內(nèi)省(Introspector)深入理解

    Java 內(nèi)省(Introspector)深入理解

    這篇文章主要介紹了Java 內(nèi)省(Introspector)深入理解的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • 如何在IDEA上安裝scala插件并創(chuàng)建工程(圖文教程)

    如何在IDEA上安裝scala插件并創(chuàng)建工程(圖文教程)

    這篇文章主要介紹了一文教你如何在IDEA上安裝scala插件并創(chuàng)建工程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Log4j日志分類和過濾敏感字段的實(shí)例

    Log4j日志分類和過濾敏感字段的實(shí)例

    這篇文章主要介紹了Log4j日志分類和過濾敏感字段的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Java內(nèi)部類的全限定名規(guī)律代碼示例

    Java內(nèi)部類的全限定名規(guī)律代碼示例

    這篇文章主要介紹了Java內(nèi)部類的全限定名規(guī)律代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • java 中cookie的詳解及簡單實(shí)例

    java 中cookie的詳解及簡單實(shí)例

    這篇文章主要介紹了java 中cookie的詳解及簡單實(shí)例的相關(guān)資料,這里對cookie 的建立與讀取,和設(shè)定cookie 生命周期等詳細(xì)介紹,需要的朋友可以參考下
    2017-01-01
  • Spring之Environment類的使用方式

    Spring之Environment類的使用方式

    這篇文章主要介紹了Spring之Environment類的使用方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • SpringBoot中Json工具類的實(shí)現(xiàn)

    SpringBoot中Json工具類的實(shí)現(xiàn)

    本文介紹在Java項(xiàng)目中實(shí)現(xiàn)一個(gè)JSON工具類,支持對象與JSON字符串之間的轉(zhuǎn)換,并提供依賴和代碼示例便于直接應(yīng)用,感興趣的可以了解一下
    2024-10-10
  • SpringBoot詳細(xì)探究講解默認(rèn)組件掃描

    SpringBoot詳細(xì)探究講解默認(rèn)組件掃描

    在項(xiàng)目中我們創(chuàng)建了Controller,這個(gè)Controller是如何被spring自動(dòng)加載的呢?為什么Controller必須放在啟動(dòng)類的同級目錄下呢
    2022-06-06
  • SpringBoot特點(diǎn)之依賴管理和自動(dòng)裝配(實(shí)例代碼)

    SpringBoot特點(diǎn)之依賴管理和自動(dòng)裝配(實(shí)例代碼)

    在使用SpringBoot的時(shí)候,會(huì)自動(dòng)將Bean裝配到IoC容器中,操作也很簡單,今天小編給大家介紹下SpringBoot特點(diǎn)之依賴管理和自動(dòng)裝配的知識(shí),感興趣的朋友一起看看吧
    2022-03-03

最新評論

青海省| 祁东县| 西乌珠穆沁旗| 维西| 三都| 汉川市| 井陉县| 水城县| 宜州市| 揭东县| 乐安县| 依安县| 刚察县| 三河市| 阿克苏市| 宜春市| 镶黄旗| 万全县| 任丘市| 文成县| 扬州市| 祁阳县| 滦平县| 曲麻莱县| 芮城县| 永川市| 冷水江市| 台南县| 法库县| 沅江市| 海阳市| 贞丰县| 寿阳县| 房产| 白城市| 珠海市| 拜泉县| 双柏县| 乐至县| 辽源市| 资阳市|