91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中深度優先與廣度優先的示例分析

發布時間:2021-04-26 12:30:17 來源:億速云 閱讀:275 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關Java中深度優先與廣度優先的示例分析的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

Java可以用來干什么

Java主要應用于:1. web開發;2. Android開發;3. 客戶端開發;4. 網頁開發;5. 企業級應用開發;6. Java大數據開發;7.游戲開發等。

在編程生活中,我們總會遇見樹性結構,這幾天剛好需要對樹形結構操作,就記錄下自己的操作方式以及過程。現在假設有一顆這樣樹,(是不是二叉樹都沒關系,原理都是一樣的)

Java中深度優先與廣度優先的示例分析

1、深度優先

英文縮寫為DFS即Depth First Search.

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

深度優先遍歷各個節點,需要使用到堆(Stack)這種數據結構。stack的特點是是先進后出。整個遍歷過程如下:

首先將A節點壓入堆中,stack(A);

將A節點彈出,同時將A的子節點C,B壓入堆中,此時B在堆的頂部,stack(B,C);

將B節點彈出,同時將B的子節點E,D壓入堆中,此時D在堆的頂部,stack(D,E,C);

將D節點彈出,沒有子節點壓入,此時E在堆的頂部,stack(E,C);

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

2、廣度優先

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

廣度優先遍歷各個節點,需要使用到隊列(Queue)這種數據結構,queue的特點是先進先出,其實也可以使用雙端隊列,區別就是雙端隊列首位都可以插入和彈出節點。整個遍歷過程如下:

首先將A節點插入隊列中,queue(A);

將A節點彈出,同時將A的子節點B,C插入隊列中,此時B在隊列首,C在隊列尾部,queue(B,C);

將B節點彈出,同時將B的子節點D,E插入隊列中,此時C在隊列首,E在隊列尾部,queue(C,D,E);

將C節點彈出,同時將C的子節點F,G,H插入隊列中,此時D在隊列首,H在隊列尾部,queue(D,E,F,G,H);

將D節點彈出,D沒有子節點,此時E在隊列首,H在隊列尾部,queue(E,F,G,H);

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

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

感謝各位的閱讀!關于“Java中深度優先與廣度優先的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

建平县| 萨嘎县| 合作市| 辽源市| 沧源| 盐源县| 赣榆县| 搜索| 蓬溪县| 普兰店市| 屯门区| 潜山县| 定边县| 屯留县| 东至县| 紫金县| 永仁县| 博野县| 奉化市| 砀山县| 烟台市| 莆田市| 通州市| 锡林郭勒盟| 清流县| 河西区| 易门县| 景德镇市| 永康市| 保定市| 江孜县| 莱西市| 大同县| 合川市| 安庆市| 叙永县| 康乐县| 治多县| 商都县| 湖北省| 永川市|