深度优先搜索和广度优先搜索详细解析和区别

一、深度优先搜索(DFS)

1. 核心思想

像探险家走迷宫,遇到岔路就选一条路走到头,无路可走时返回上一个岔路口换另一条路。

2. 实现方式

数据结构:栈(Stack,先进后出)或 递归(隐式栈)
遍历顺序:纵向深入,优先访问最深层的节点

3. 图解示例

假设有以下树结构:

        A
      /   \
     B     C
    / \   /
   D   E F

DFS遍历顺序(从根节点A出发):

A → B → D → E → C → F

4. 代码实现(Python)

def dfs(graph, start):
    stack = [start]          # 初始化栈
    visited = set()          # 记录已访问节点
    
    while stack:
        node = stack.pop()   # 弹出栈顶元素
        if node not in visited:
            print(node)      # 访问节点
            visited.add(node)
            # 将相邻节点逆序压栈(保证顺序正确)
            for neighbor in reversed(graph[node]):
                if neighbor not in visited:
                    stack.append(neighbor)

# 示例图的邻接表表示
graph = {
    'A': ['B', 'C'],
    'B': ['D', 'E'],
    'C': ['F'],
    'D': [],
    'E': [],
    'F': []
}

dfs(graph, 'A')  # 输出:A → B → D → E → C → F

二、广度优先搜索(BFS)

1. 核心思想

像水波纹扩散,从起点逐层向外探索,先访问所有相邻节点再深入下一层。

2. 实现方式

数据结构:队列(Queue,先进先出)
遍历顺序:横向扩展,优先访问同一层的所有节点

3. 图解示例

使用同一棵树结构:

        A
      /   \
     B     C
    / \   /
   D   E F

BFS遍历顺序(从根节点A出发):

A → B → C → D → E → F

4. 代码实现(Python)

from collections import deque

def bfs(graph, start):
    queue = deque([start])   # 初始化队列
    visited = set()          # 记录已访问节点
    
    while queue:
        node = queue.popleft()  # 弹出队首元素
        if node not in visited:
            print(node)         # 访问节点
            visited.add(node)
            # 将相邻节点加入队列
            for neighbor in graph[node]:
                if neighbor not in visited:
                    queue.append(neighbor)

bfs(graph, 'A')  # 输出:A → B → C → D → E → F

三、DFS与BFS的关键区别

对比维度	                DFS(深度优先)	           BFS(广度优先)
数据结构	              栈(递归或显式栈)	                队列
空间复杂度	         O(h)(h为树的高度)	           O(w)(w为树的宽度)
适用场景	         寻找所有解、拓扑排序、路径存在性	 最短路径、层级遍历、社交网络关系查找
遍历顺序	                 纵向深入	                   横向扩展
内存消耗	               对深树更高效	                 对宽树更高效

四、实际应用场景

1. DFS典型应用

迷宫求解:找到一条可行路径(不一定最短)

棋盘游戏(如数独):递归尝试所有可能的填充方式

文件系统遍历:深度优先访问文件夹

2. BFS典型应用

社交网络:查找3度好友关系

最短路径:未加权图中的最短路径(如迷宫最短出口)

网页爬虫:按层级抓取网页

五、可视化对比

假设要在下图中从A到F:

    A
   / \
  B   C
  |   |
  D   E
   \ /
    F
DFS可能路径:A → B → D → F 或 A → C → E → F
BFS保证路径:A → C → E → F(最短路径,假设边权重相同)

六、如何选择算法?

若需要 最短路径 或 层级关系 → BFS
若需要 遍历所有可能性 或 内存有限 → DFS

你可能感兴趣的:(深度优先,宽度优先,算法,数据结构)