DFS的递归本质分析
作者:野牛程序员:2025-09-15 16:56:37算法阅读 2403
DFS的递归本质分析
1. 递归的来源——DFS 本质
DFS(深度优先搜索)的核心思想是:
“从一个节点出发,把所有可能深入的路径都走一遍,直到没有新的节点可走,再回溯到上一层节点。”
“把所有可能深入的路径都走一遍”——这是递归的自然体现:每次深入访问一个节点,然后再访问它的子节点,就像函数自己调用自己。
回溯本质就是函数执行完子节点的递归后返回上一层。
换句话说,递归是实现深度优先遍历最自然的方法。
如果不想递归,也可以用栈模拟,但逻辑上是一样的:每访问一个节点,就把它的子节点压入栈,逐个访问。
2. 循环遍历邻居——处理每个分支
每个节点可能有多个相邻节点(孩子或者邻居),而 DFS 需要遍历它们每一个。
循环
for (int v : g[u])就是“枚举所有可能的下一步”,即遍历每个子节点。对每个子节点递归调用 DFS,深度+1。
思路理解:
当前节点
u的邻居有v1, v2, v3…每个邻居都可能是新的分支,需要进入它们的子树。
所以循环遍历邻居,把每个邻居作为新的起点递归访问。
循环和递归结合的模式自然出现了:
for (int v : g[u]) {
if (v == parent) continue; // 避免回到父节点
depth[v] = depth[u] + 1; // 更新深度
dfs(v, u); // 递归访问子节点
}循环负责遍历所有分支。
递归负责深入每条分支直到末端。
3. 思路总结
如果想像不到这种写法,可以尝试以下方法训练思维:
抽象问题为树/图:先想“每个节点可以去哪些地方”。
找到重复模式:访问子节点的操作是一样的,每次都需要深度+1并访问它的邻居。
想到递归:每次访问子节点的操作和访问当前节点一样,所以递归自然出现。
处理多分支:每个节点可能有多个邻居,用循环遍历。
换句话说,循环解决“多条路”,递归解决“深度遍历同样的操作”。
野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892

