使用递归的JavaScript中的BFS

使用递归的JavaScript中的BFS,javascript,algorithm,tree,breadth-first-search,tree-traversal,Javascript,Algorithm,Tree,Breadth First Search,Tree Traversal,使用递归执行DFS很容易: function dfs(tree, fn, level) { fn(tree, level) tree.children.forEach(function(child){ dfs(child, fn, level + 1) }) } 然而,我所看到的每一个BFS都使用一个队列,并且是迭代的,而不是递归的。想知道是否有任何方法可以定义递归BFS算法。如果兄弟节点可以排序并具有信息或检索其兄弟节点信息的方法,我们可以按照广度优先搜索的顺序执行。显然

使用递归执行DFS很容易:

function dfs(tree, fn, level) {
  fn(tree, level)
  tree.children.forEach(function(child){
    dfs(child, fn, level + 1)
  })
}

然而,我所看到的每一个BFS都使用一个队列,并且是迭代的,而不是递归的。想知道是否有任何方法可以定义递归BFS算法。

如果兄弟节点可以排序并具有信息或检索其兄弟节点信息的方法,我们可以按照广度优先搜索的顺序执行。显然,对于抽象数据,在我们进行构建树的过程中,就像计算随后的棋局一样,这可能是不可能的,也可能非常复杂。然而,树数据结构可以通过提供兄弟信息来构建

下面是一个使用伪“同级”和“完成”函数的示例。如果我们不能保证每个节点都有子节点,我们可能需要一个额外的参数来记录最后看到的子节点。请注意,“下一个兄弟姐妹”可以类似于链表,但也可以实现为根据已知信息计算下一个兄弟姐妹的方法

函数bfs(树,fn){
fn(树);
如果(tree.done)返回;
if(tree.islastshibling)
bfs(tree.children.firstSibling(),fn);
其他的
bfs(tree.nextSibling(),fn);
}
变量c4={
瓦尔:“c4”,
是的,
完成:对
}
变量c3={
val:'c3',
下一个签名:()=>c4
}
变量c2={
val:'c2',
下一个签名:()=>c3
}
变量c1={
val:'c1',
下一个签名:()=>c2
}
变量b2={
val:'b2',
是的,
子项:{firstSibling:()=>c1}
}
变量b1={
val:‘b1’,
下一个签名:()=>b2
}
变量a={
瓦尔:“a”,
是的,
子项:{firstSibling:()=>b1}
}

bfs(a,tree=>console.log(tree.val))
类似于?如果图形是树,则可以使用迭代深化。如果它是一个普通图,你必须支付内存开销,但是你可以在堆栈上传递队列,使其“递归”。是的,与此类似,但没有明确的答案,除非答案是“不”,否则你不能这样做。(不知道他们是不是这么说的)。我想看看递归需要什么,你可以把循环写成一个(尾部)递归函数,但是你不能去掉队列。这是BFS固有的。耶,这正是我想要的!谢谢:)