Python邻接矩阵DFS无法遍历到E节点问题排查及步骤打印需求
问题排查:DFS无法到达E节点的原因
原代码执行流程分析
按照你的代码逻辑,E节点实际上是可以被访问到的,遍历顺序为 A→B→D→C→E。你可能没注意到最后一步的输出,因为E是最后被访问的节点。
不过代码存在两个容易造成误解的问题:
- 访问状态打印时机错误:代码先打印
vis和un_vis,再将当前节点加入已访问列表,导致每次打印的状态不包含当前正在处理的节点。比如初始调用时,打印的visited是空列表,但此时正在处理A节点,容易让你误以为节点未被访问。 - 字符串查找的低效判断:用
mapping[neigh] in un_vis判断邻居是否未访问,需要遍历字符串列表,虽然不影响功能,但效率较低。
修复后的代码
调整打印时机,确保打印状态包含当前处理的节点,同时优化判断逻辑:
def dfs(node, vis, un_vis, adj, mapping): # 先更新访问状态,再打印 vis.append(mapping[node]) un_vis.remove(mapping[node]) print("visited -> ", vis) print("unvisited -> ", un_vis) print() for neigh in range(len(adj[0])): if adj[node][neigh] == 1 and mapping[neigh] in un_vis: dfs(neigh, vis, un_vis, adj, mapping) adj = [[0,1,1,1,0], [1,0,0,1,1], [1,0,0,1,0], [1,1,1,1,1], [0,1,0,1,0]] vis = [] un_vis = ['A','B','C','D','E'] starting_node = 0 mapping = {0:'A',1:'B',2:'C',3:'D',4:'E'} dfs(starting_node, vis, un_vis, adj, mapping)
修复后输出示例
visited -> ['A'] unvisited -> ['B', 'C', 'D', 'E'] visited -> ['A', 'B'] unvisited -> ['C', 'D', 'E'] visited -> ['A', 'B', 'D'] unvisited -> ['C', 'E'] visited -> ['A', 'B', 'D', 'C'] unvisited -> ['E'] visited -> ['A', 'B', 'D', 'C', 'E'] unvisited -> []
从输出可以清晰看到E节点被正常访问的完整过程。
内容的提问来源于stack exchange,提问作者Aadhar Jain
相关产品推荐
相关产品推荐

