Breadth First Search in Python (宽度/广度优先搜索)

宽搜/广搜简称BFS,Dijkstra单源最短路径算法和Prim最小生成树算法均使用广搜的思想,从一点出发向外辐射直至遍历所有结点。广搜主要用于解决最短路径、层序遍历和大范围查找问题。本文主要总结在图和树(特殊的图)上的广搜。

示例1:

图的广度优先搜索(图源为AI AX AT)

代码:

import os
import sys

graph = {
	1: {2, 3},
	2: {1, 4, 5},
	3: {1, 6, 7},
	4: {2, 8},
	5: {2, 8},
	6: {3, 8, 9},
	7: {3, 9},
	8: {4, 5, 6},
	9: {6, 7}
}

def bfs(graph, s):
    queue = [s] 
    parent = {s: None}
    flag = set()
    flag.add(s)
    
    while queue:
        temp = queue.pop()
        nodes = graph[temp]    
        for vertex in nodes:
            if vertex not in flag:
                queue.append(vertex)
                flag.add(vertex)
                parent[vertex] = temp
    return parent

parent = bfs(graph, 1)
v = 8
while v:
    print(v, end=' ')
    v = parent[v]

解释:

1)此处手动输入了示例1,若实际图过大或复杂可以设置相应类

2)parent字典用于记录某结点的父结点,方便路径回溯;flag为一个集合,用于标记已经遍历过的结点(该图为无向图);s为起始结点,v为终止结点。

示例2:

图的广度优先搜索(图源为AI AX AT) 

代码:

class TreeNode:
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None

def levelOrder(root):
    queue = [root]
    next_queue = []
    result = []
    if root is None:
    	return []
    
    while queue:
        for root in queue:
            result.append(root.val)
            if root.left:
                next_queue.append(root.left)
            if root.right:
                next_queue.append(root.right)
        queue = next_queue
        next_queue = []
    return result

if __name__ == "__main__":
	tree = TreeNode(4)
	tree.left = TreeNode(9)
	tree.right = TreeNode(0)
	tree.left.left = TreeNode(5)
	tree.left.right = TreeNode(1)
	tree.right.left = TreeNode(3)
	tree.right.right = TreeNode(2)
	tree.left.left.left = TreeNode(10)
	tree.right.left.right = TreeNode(7)
	print(levelOrder(tree))

 解释:

1)树的广度优先搜索本质上即为树的层次遍历

树的层次遍历详见(特别注意输出方式即可):

LeetCode in Python 102. Binary Tree Level Order Traversal (二叉树的层序遍历)-CSDN博客

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值