2012-04-16 113 views
4

我想通了深度優先遍歷樹。廣度優先遍歷樹,巨蟒

def _dfs(tree, res): 
    if tree: 
     res += [tree.key] 
     _dfs(tree.left, res) 
     _dfs(tree.right, res) 
    return res 

我似乎無法找到廣度優先搜索解決方案。將不得不使用隊列或堆棧?

謝謝!

回答

3

是的,你必須使用一個隊列來保存您檢查過,但還沒有遞歸到節點。

從隊列中的根節點開始,然後重複[彈出一個節點併爲其每個子節點執行所需的任何操作(res += [tree.key])並將其推送到隊列中]。

+0

當我將它們存儲在一個堆棧中時,是否先存儲它們,同時先穿越Depth? – isal 2012-04-16 09:49:29

+0

對不起,隊列不疊加。我修復/擴展了我的答案。 – 2012-04-16 09:52:31

+0

明白了!謝謝! – isal 2012-04-16 10:22:48

6

你可以用雙端去。這是一個經典的實現(使用FIFO隊列)從馬格努斯烈赫特蘭的高爐。

from collections import deque 

def bfs(G, s): 
    P, Q = {s: None}, deque([s]) 
    while Q: 
     u = Q.popleft() 
     for v in G[u]: 
      if v in P: continue 
      P[v] = u 
      Q.append(v) 
    return P