BFS (Breadth First Search)
广度优先的[递归]伪代码如下:
把start节点push入队列;
while(队列不为空) {
把队列首节点pop出队列;
对节点进行相关处理或者判断;
while(此节点有下一个相关节点){
把相关节点push入对列;
}
}
def bfs(self,root): # 传入树的根节点
quene=[]
q.append(root)
while len(q)!=0:
every_layer=[]
length=len(q)
for i in range(length):
r=q.pop(0)
if not r.left is None:
q.append(r.left)
if not r.right is None:
q.append(r.right)
every_layer.append(r.val)
print every_layer
print ' '
result.append(every_layer)
DFS (Deep First Search)
find(节点){
if(此结点已经遍历 || 此节点在图外 || 节点不满足要求) return;
if(找到了end节点) 输出结果 ; return;
标记此节点,表示已经遍历过了;
while(存在下一个相邻节点) find(下一个节点);
}
def iter_dfs(G,s):
S,Q = set(),[] #访问集合和队列
Q.append(s) #我们计划访问s
while Q:
u = Q.pop() #使程序进展
if u in S:continue #是否访问过?跳过
S.add(u)
Q.extend(G(u))
yield u #u就是我们要的
利用栈实现
def dfs(node):
if node is None:
return
nodeSet = set()
stack = []
print(node.value)
nodeSet.add(node)
stack.append(node)
while len(stack)>0:
cur = stack.pop()
for next in cur.nexts:
if next not in nodeSet:
stack.append(cur)
stack.append(next)
set.add(next)
print(next.value)
break