python 实现BFS(广度优先搜索),DFS(深度优先搜索)

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

思路:
python 实现BFS(广度优先搜索),DFS(深度优先搜索)_第1张图片
在这里插入图片描述

利用栈实现
每次从栈的末尾弹出一个元素,搜索所有在它下一级的元素,把这些元素压入栈中。并把这个元素记为它下一级元素的前驱。
如图,我们以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

你可能感兴趣的:(python 实现BFS(广度优先搜索),DFS(深度优先搜索))