递归调用中path变量未更新:LeetCode所有路径问题解法错误排查
代码问题分析
- 参数赋值作用域问题:JavaScript中数组属于引用类型,你在
findPath函数内执行path = [0]时,仅修改了当前函数作用域内path形参的指针指向,不会修改上层递归中传入的原数组内容,你预期的重置路径的操作根本不会作用到上层调用的路径上。 - 缺少回溯操作:这类全路径搜索属于典型的回溯算法场景,正确逻辑是向路径中压入当前节点、递归搜索子节点、递归返回后弹出当前节点(回溯),你当前代码没有弹出操作,路径会不断堆积之前遍历过的节点,完全不符合预期。
- 函数无返回值:入口函数
allPaths最后没有返回收集好的result数组,调用后无法拿到最终结果。
修复后的代码
const allPaths = (edges) => { const graph = buildAdjacencyListGraph(edges); const result = [] const path = [0]; findPath(graph, 0, edges.length - 1, result, path) return result; // 补充返回结果 } const findPath = (graph, src, dest, result, path) => { for (let neighbor of graph[src]) { path.push(neighbor); if (neighbor === dest) { result.push([...path]) } else { findPath(graph, neighbor, dest, result, path); } path.pop(); // 回溯:递归完成后弹出当前节点,恢复路径状态 } } const buildAdjacencyListGraph = (edges) => { const graph = {}; for (let [i, edge] of edges.entries()) { graph[i] = edge; } return graph; } // 测试 const graph = [[4,3,1],[3,2,4],[3],[4],[]] console.log(allPaths(graph)) // 输出:[[0,4],[0,3,4],[0,1,3,4],[0,1,2,3,4],[0,1,4]]
内容的提问来源于stack exchange,提问作者Mike Sharpe
相关产品推荐
相关产品推荐

