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

无向图DFS遍历实现:如何打印包含回退节点的完整遍历路径?

解决DFS遍历路径缺失回溯节点的问题

我明白你的问题了——你想要的是完整的DFS遍历轨迹,包括回溯过程中回退到已访问节点的步骤,但当前代码只打印了首次访问的新节点,漏掉了那些为了寻找未访问节点而回退的节点。

问题根源

你的DFS函数仅在发现未访问的邻接节点时,打印该新节点并递归进入;但当子节点的遍历完成、回溯回当前节点时,没有任何代码记录这个回退动作,所以路径里缺失了像3→2、5→4这样的回退步骤。

解决方案

我们只需要在递归调用返回后(也就是完成子节点的DFS遍历,回溯到当前节点时),打印当前节点,就能把回退步骤记录下来。修改后的DFS函数如下:

void DFS(struct Graph* graph, int vertex) {
    struct node* adjList = graph->adjLists[vertex];
    struct node* temp = adjList;
    graph->visited[vertex] = 1;
    while (temp != NULL) {
        int connectedVertex = temp->vertex;
        if (graph->visited[connectedVertex] == 0) {
            printf("node: %d\n", connectedVertex);
            DFS(graph, connectedVertex);
            // 回溯时打印当前节点,记录回退步骤
            printf("node: %d\n", vertex);
        }
        temp = temp->next;
    }
}

运行结果说明

修改后运行代码,你会得到如下输出:

node: 1
node: 2
node: 3
node: 2
node: 4
node: 5
node: 4
node: 6
node: 4
node: 2
node: 1

这比你预期的路径多了最后几步6→4→2→1,这是因为当所有节点都被访问完成后,DFS会继续回溯到起始节点0(只是0没有被打印)。如果你的需求是仅打印到访问完最后一个节点6为止,可以额外添加一个判断:检查是否还有未访问的节点,只有当存在未访问节点时才打印回溯步骤。不过通常来说,完整的DFS遍历轨迹是包含全部回溯步骤的,你的预期路径可能是省略了后续的回溯部分。

补充说明

你的邻接表排序逻辑是正确的(通过sortedInsert保证每次选最小的邻接节点),所以遍历的顺序符合预期,只需要补充回溯步骤的打印即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 22:07:30