图的广度优先遍历(BFS)和深度优先遍历(DFS)

一. BFS(广度优先遍历)

在这里插入图片描述

1. 理解

概念
BFS即广度优先遍历,BFS总是先访问完同一层的结点,然后才继续访问下一层结点,它最有用的性质是可以遍历一次就生成起始结点到所遍历结点的最短路径,这一点在求无权图的最短路径时非常有用。
遍历
选择任意一个结点作为开始的结点,假如从A点出发:
可能的结果有:
A B C D E F
A C B D E F
A C B E D F
A B C E D F (❌)因为B没有和E相连,而且要求在遍历的时候先走哪一个就把那一个走完。
假如从E点出发:
E C D A B F

2. 类比

类比树有这种层序遍历的思想
在这里插入图片描述

3. 代码实现

需要借用一个队列来实现。

graph = {
	"A": ["B", "C"],
	"B": ["A", "C", "D"],
	"C": ["A", "B", "D", "E"],
	"D": ["B", "C", "E", "F"],
	"E": ["C", "D"],
	"F": ["D"]
}
# print(grap.keys())
# s代表开始的结点
def BFS(graph, s):
	queue = []
	queue.append(s)
	seen = set()  #定义一个集合
	seen.add(s)
	while len(queue)>0:
		vertex = queue.pop(0)
		nodes = graph[vertex]
		for w in nodes:
			if w not in seen:
				queue.append(w)
				seen.add(w)
		print(vertex)
BFS(graph, 'A')
4. 扩展 无权图求最短路径

通过一次广度优先遍历之后,可以得到从起始点出发到某一点的最短路径。
在这里插入图片描述

graph = {
	"A": ["B", "C"],
	"B": ["A", "C", "D"],
	"C": ["A", "B", "D", "E"],
	"D": ["B", "C", "E", "F"],
	"E": ["C", "D"],
	"F": ["D"]
}
# s代表开始的结点
def BFS(graph, s):
	queue = []
	queue.append(s)
	seen = set()  #定义一个集合
	seen.add(s)
	parent = {s: None}
	while len(queue)>0:
		vertex = queue.pop(0)
		nodes = graph[vertex]
		for w in nodes:
			if w not in seen:
				queue.append(w)
				seen.add(w)
				parent[w] = vertex
		print(vertex)
	return parent
parent = BFS(graph, 'E')
print(parent)
v = 'B'
while v!= None:
	print(v)
	v = parent[v]

二. DFS(深度优先遍历)

1. 理解

从任意一点出发,一直走到底。
在这里插入图片描述

2. 代码实现:

需要借助一个栈来实现。

graph = {
	"A": ["B", "C"],
	"B": ["A", "C", "D"],
	"C": ["A", "B", "D", "E"],
	"D": ["B", "C", "E", "F"],
	"E": ["C", "D"],
	"F": ["D"]
}
# print(grap.keys())
# s代表开始的结点
def DFS(graph, s):
	stack = []
	stack.append(s)
	seen = set()  #定义一个集合
	seen.add(s)
	while len(stack)>0:
		vertex = stack.pop()
		nodes = graph[vertex]
		for w in nodes:
			if w not in seen:
				stack.append(w)
				seen.add(w)
		print(vertex)
DFS(graph, 'A')

参考链接:https://www.bilibili.com/video/av25761720/?spm_id_from=333.788.videocard.1
参考链接:https://www.bilibili.com/video/av25763384/?spm_id_from=333.788.videocard.0

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
二叉树的广度优先遍历BFS)可以使用队列来实现,具体步骤如下: 1. 创建一个空队列,并将根节点入队。 2. 当队列不为空时,执行以下操作: - 出队一个节点,将其值存储或打印。 - 将出队节点的左子节点入队(如果存在)。 - 将出队节点的右子节点入队(如果存在)。 3. 重复步骤2,直到队列为空。 下面是一个Python实现的示例代码: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def bfs(root): if not root: return [] result = [] queue = [root] while queue: node = queue.pop(0) result.append(node.val) if node.left: queue.append(node.left) if node.right: queue.append(node.right) return result ``` 对于深度优先遍历DFS),有两种常用的方法:前序遍历、中序遍历和后序遍历。下面以前序遍历为例进行解释。 前序遍历的顺序是:根节点 -> 左子树 -> 右子树。具体实现步骤如下: 1. 创建一个空列表,用于存储遍历结果。 2. 定义一个辅助函数,接收一个节点作为参数: - 若节点为空,返回。 - 将节点的值存储或打印。 - 递归调用辅助函数遍历节点的左子树。 - 递归调用辅助函数遍历节点的右子树。 3. 调用辅助函数,将根节点作为参数传入。 下面是一个Python实现的示例代码: ```python def dfs(root): if not root: return [] result = [] def helper(node): if not node: return result.append(node.val) helper(node.left) helper(node.right) helper(root) return result ``` 这样,你就可以使用这两个函数来实现二叉树的广度优先遍历深度优先遍历了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

. . . . .

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值