You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python如何对边为元组列表的图实现递归DFS遍历

基于边元组列表的图递归DFS遍历实现

你需要先把输入的边列表转换为便于遍历的邻接表结构,再通过递归逻辑实现深度优先搜索,过程中需要记录已访问节点避免环结构导致的无限递归,同时覆盖图中所有不连通分量保证遍历到全部节点。

实现步骤

  • 第一步:解析边列表,构建邻接表。邻接表用字典存储,键为节点,值为该节点直接连通的相邻节点列表,同时收集全量节点用于后续全图遍历。
  • 第二步:实现递归DFS核心逻辑:访问当前节点时标记为已访问、加入遍历结果,再依次递归遍历当前节点所有未访问的邻接节点。
  • 第三步:遍历所有未访问的节点作为DFS起点,避免遗漏不连通分量里的节点。

完整可运行代码

def build_adjacency_list(edges):
    adj = {}
    all_nodes = set()
    for u, v in edges:
        all_nodes.add(u)
        all_nodes.add(v)
        # 按有向边构建:u -> v,如果是无向图,额外添加adj[v].append(u)即可
        if u not in adj:
            adj[u] = []
        adj[u].append(v)
    return adj, all_nodes

def dfs_recursive(current, adj, visited, result):
    # 标记当前节点为已访问,加入结果列表
    visited.add(current)
    result.append(current)
    # 遍历所有邻接节点,未访问则递归深入
    for neighbor in adj.get(current, []):
        if neighbor not in visited:
            dfs_recursive(neighbor, adj, visited, result)

def dfs_traverse_all_nodes(edges):
    adj, all_nodes = build_adjacency_list(edges)
    visited = set()
    traverse_result = []
    # 遍历所有节点,从未访问的节点启动DFS,覆盖全部分量
    for node in all_nodes:
        if node not in visited:
            dfs_recursive(node, adj, visited, traverse_result)
    return traverse_result

# 测试示例
edges = [('human', 'mammal'), ('mammal', 'vertebrate'), ('mouse', 'mammal'), ('vertebrate', 'animal')]
print(dfs_traverse_all_nodes(edges))

补充说明

以上测试用例的典型DFS输出为['human', 'mammal', 'vertebrate', 'animal', 'mouse'],邻接节点的遍历顺序和边列表的输入顺序一致,如果需要调整遍历优先级,可以在构建邻接表后对每个节点的邻接列表做自定义排序。

注意:如果图存在环结构,visited集合会拦截重复访问的节点,不会出现无限递归的问题。如果只需要从指定起点开始遍历,直接调用dfs_recursive(指定起点, adj, set(), [])即可拿到对应起点出发的DFS遍历结果。

内容的提问来源于stack exchange,提问作者sujaypatil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 13:36:23