JavaScript递归查询树形节点路径功能异常如何修复
问题原因
你的深度优先遍历思路是正确的,出错的核心点是递归回溯时没有弹出当前节点:
你把当前节点push到visitedStack之后,遍历完它的所有子节点,它就不再属于后续其他分支的路径了,必须执行pop操作把它从栈顶移除,否则所有访问过的节点都会一直堆积在visitedStack里,导致后续的路径都包含之前遍历过的无关节点。
修复后的代码
调整递归函数,在遍历完当前节点的子节点后新增回溯弹出逻辑即可,同时将没必要的map改为普通循环遍历:
const findPath = (input = "world", data, visitedStack, dataStack) => { // 遍历当前层级所有节点 for (const node of data) { // 当前节点入栈 visitedStack.push({ id: node.id, name: node.name }); // 匹配到关键词就存储当前完整路径 if (node.name.toLowerCase().includes(input.toLowerCase())) { dataStack.push([...visitedStack]); } // 递归遍历当前节点的所有子节点 findPath(input, node.children, visitedStack, dataStack); // 回溯操作:当前节点的所有子节点遍历完毕,弹出当前节点 visitedStack.pop(); } }; // 调用方法 const result = []; findPath("world", Data, [], result); // 此时result就是你需要的目标结构
内容的提问来源于stack exchange,提问作者webber
相关产品推荐
相关产品推荐

