BFS
思路:
利用队列实现
创建一个空队列,加入首节点的拓展
新建一个空列表,用于后边的判重
如果没用重复,然后比对,符合返回,不符合加到队列尾部
遍历完所有队列数据,如果没有符合的,返回False
from collections import deque
def search(name):#广度优先搜索(BFS)
#deque()函数创建一个双端队列(先进先出)
#注意deque是python标准库cillections中的一个模块
search_quene = deque()
search_quene += graph[name]
#创建空列表的目的:为了防止后边添加到队列里的元素与之前的重复出现
#所以我加入一个空列表,将判断完成的数据添加的这个列表,将准备进入列表的数据与这个列表元素对比,确保没有重复元素再次进入队列,防止无限循环产生
searched = []
while search_quene:
#队列中,pop()默认抛出右边元素,但是我们希望,append()从右边入队,popleft()从左边出队
person = search_quene.popleft()
if person not in searched:
#person_is_not()是一个判断函数,我们需要判断我们查找的内容是否满足我们的需求
if person_is_not(person):
print (person+" is this")
return True
else:
search_quene += graph[person]
searched.append(person)
return False
DFS
思路:
利用栈实现
每次从栈的末尾弹出一个元素,搜索所有在它下一级的元素,把这些元素压入栈中。并把这个元素记为它下一级元素的前驱。
如图,我们以A为首节点,然后找到B节点,然后再找到D节点,D节点再无子节点,然后放回上一节点,然后在找到E节点,再无子节点返回上一节点,B的子节点全部便利后继续返回,然后找到C节点,F节点,G节点
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