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

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

 更新時間:2017年12月08日 09:55:17   作者:nickTimer  
這篇文章主要介紹了深度優(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> nodeDeque = new ArrayDeque>();
 Map node = new HashMap();
 nodeDeque.add(node);
 while (!nodeDeque.isEmpty()) {
  node = nodeDeque.peekFirst();
  System.out.println(node);
  //獲得節(jié)點的子節(jié)點,對于二叉樹就是獲得節(jié)點的左子結(jié)點和右子節(jié)點
  List> children = getChildren(node);
  if (children != null && !children.isEmpty()) { 
   for (Map child : children) {
    nodeDeque.add(child);
   }
  }
 }
}
//這里使用的是雙端隊列,和使用queue是一樣的

總結(jié)

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

相關(guān)文章

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

    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)深入理解

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

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

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

    Log4j日志分類和過濾敏感字段的實例

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

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

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

    java 中cookie的詳解及簡單實例

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

    Spring之Environment類的使用方式

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

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

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

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

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

    SpringBoot特點之依賴管理和自動裝配(實例代碼)

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

最新評論

泰州市| 彝良县| 龙游县| 南阳市| 防城港市| 成都市| 论坛| 揭东县| 南康市| 广安市| 谢通门县| 道孚县| 城步| 九龙城区| 宜宾市| 泰和县| 霍林郭勒市| 监利县| 阿合奇县| 宁津县| 台山市| 名山县| 万年县| 武穴市| 门头沟区| 永胜县| 兴业县| 巴马| 那曲县| 新密市| 双鸭山市| 孟村| 凤山县| 惠州市| 兴文县| 密云县| 景德镇市| 武城县| 周宁县| 新巴尔虎右旗| 娄底市|