2012-04-16 72 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