亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

廣度優先vs深度優先

廣度優先vs深度優先

慕勒3428872 2019-11-21 14:37:00
遍歷樹/圖時,廣度優先和深度優先有什么區別?任何編碼或偽代碼示例都很好。
查看完整描述

3 回答

?
夢里花落0921

TA貢獻1772條經驗 獲得超6個贊

這兩個術語區分了步行樹的兩種不同方式。


展示差異可能是最容易的。考慮這棵樹:


    A

   / \

  B   C

 /   / \

D   E   F

一個深度優先遍歷將訪問節點順序


A, B, D, C, E, F

請注意,在繼續前進之前,您要完全沿著一條腿向下移動。


一個廣度優先遍歷將訪問節點順序


A, B, C, D, E, F

在這里,我們一直深入到每個級別,然后再進行下去。


(請注意,遍歷順序有些歧義,我作弊要在樹的每個級別上保持“讀取”順序。無論哪種情況,我都可以在C之前或之后到達B,同樣,我可以到達E在F之前或之后。這可能會或可能不會重要,取決于您的應用程序...)


兩種遍歷都可以通過偽代碼實現:


Store the root node in Container

While (there are nodes in Container)

   N = Get the "next" node from Container

   Store all the children of N in Container

   Do some work on N

兩種遍歷順序之間的差異在于對的選擇Container。


對于深度,請先使用堆棧。(遞歸實現使用調用堆棧...)

對于廣度優先,請使用隊列。

遞歸實現看起來像


ProcessNode(Node)

   Work on the payload Node

   Foreach child of Node

      ProcessNode(child)

   /* Alternate time to work on the payload Node (see below) */

當您到達沒有子節點的節點時,遞歸結束,因此對于有限的非循環圖,可以保證遞歸結束。


在這一點上,我還是有點作弊。隨著一點點的小聰明,你也可以工作在這個秩序中的節點:


D, B, E, F, C, A

這是深度優先的一種變體,在這種情況下,直到我向后走到樹上之前,我不會在每個節點上進行工作。但是,我在去的途中參觀了較高的節點以找到他們的孩子。


在遞歸實現中,這種遍歷是很自然的(使用上面的“ Alternate time”行而不是第一條“ Work”行),并且如果您使用顯式堆棧也不會太難,但是我將其保留為練習。


查看完整回答
反對 回復 2019-11-21
  • 3 回答
  • 0 關注
  • 968 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號