深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索树或图的数据结构算法。其核心思想是尽可能深地探索树的分支。如果当前节点还有未访问的子节点,则继续深入;若所有子节点均已被访问,则返回上一层。
在迷宫问题中,可以将迷宫表示为一个图结构,每个交叉口是节点,每条通路是边。通过深度优先搜索算法,可以从起点开始不断寻找下一可能的走法直到终点。
def dfs_maze(maze, start, end):
stack = [start]
visited = set()
while stack:
current_node = stack.pop()
if current_node == end:
return True
for neighbor in maze[current_node]:
if neighbor not in visited:
stack.append(neighbor)
visited.add(current_node)
return False
深度优先搜索可以用来判断一个图是否是连通的。如果从任一节点开始遍历,最终能够访问到所有节点,则说明该图是连通的。
def is_connected(graph):
visited = set()
def dfs(node):
if node in visited:
return False
visited.add(node)
for neighbor in graph[node]:
dfs(neighbor)
start_node = next(iter(graph.keys()))
dfs(start_node)
# Check if all nodes are visited
return len(visited) == len(graph)
在有向无环图(DAG)中,深度优先搜索可以用来计算节点的拓扑排序。通过记录每个节点的递归深度和完成时间,可以将所有节点按一定的顺序输出。
def topological_sort(graph):
visited = {}
stack = []
def dfs(node):
if node in visited:
return
for neighbor in graph[node]:
dfs(neighbor)
visited[node] = True
stack.append(node)
for node in graph:
dfs(node)
return stack[::-1]
在二叉树中,可以使用深度优先搜索来寻找指定目标值的路径。
def path_sum(root, target):
if not root:
return []
def dfs(node, current_path):
if not node.left and not node.right and sum(current_path) == target:
paths.append(list(current_path))
if node.left:
current_path.append(node.left.val)
dfs(node.left, current_path)
current_path.pop()
if node.right:
current_path.append(node.right.val)
dfs(node.right, current_path)
current_path.pop()
paths = []
dfs(root, [root.val])
return paths
深度优先搜索是一种强大的算法,适用于解决各种问题。从迷宫寻路到图的连通性检查、拓扑排序以及二叉树路径和等场景中,它都发挥了重要作用。通过不断深入探索分支,DFS 能够有效地找到所需的信息或解决方案。在实际应用中,灵活运用 DFS 可以帮助我们更高效地解决问题。