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

适用于非加权图中的最短路径

思路:

在这里插入图片描述

利用栈实现
每次从栈的末尾弹出一个元素,搜索所有在它下一级的元素,把这些元素压入栈中。并把这个元素记为它下一级元素的前驱。
如图,我们以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
  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值