【问题标题】:BFS in JavaScript using Recursion使用递归的 JavaScript 中的 BFS
【发布时间】:2018-06-22 10:57:11
【问题描述】:

使用递归很容易做 DFS:

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

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

【问题讨论】:

  • 类似于stackoverflow.com/questions/2549541/… ?如果你的图是一棵树,你可以使用迭代深化。如果是通用图,则需要支付内存成本,但可以通过堆栈上的队列使其“递归”。
  • 是的,与此类似,但没有明确的答案,除非答案是否定的,否则您不能这样做。 (不知道这是否是他们所说的)。我想看看递归执行它需要什么。
  • 您始终可以将循环编写为(尾)递归函数,但不能取消队列。这是 BFS 所固有的。

标签: javascript algorithm tree breadth-first-search tree-traversal


【解决方案1】:

如果兄弟节点可以排序并且有信息或方法来检索有关其兄弟节点的信息,我们可以按广度优先搜索的顺序执行。显然,使用抽象数据,边走边构建树,就像计算随后的国际象棋移动一样,这可能是不可能的或过于复杂。但是,可以使用兄弟信息的规定来构建树数据结构。

这是一个带有虚拟“兄弟”和“完成”功能的示例。如果我们不能保证每个节点都有孩子,我们可能需要一个额外的参数来记录最后看到的孩子。请注意,“下一个兄弟”可能类似于链表,但也可以实现为一种基于已知信息计算下一个兄弟的方法。

function bfs(tree, fn) {
  fn(tree);
  
  if (tree.done) return;
  
  if (tree.isLastSibling)
    bfs(tree.children.firstSibling(), fn);
  else
    bfs(tree.nextSibling(), fn);
}

var c4 = {
  val: 'c4',
  isLastSibling: true,
  done: true
}

var c3 = {
  val: 'c3',
  nextSibling: () => c4
}

var c2 = {
  val: 'c2',
  nextSibling: () => c3
}

var c1 = {
  val: 'c1',
  nextSibling: () => c2
}

var b2 = {
  val: 'b2',
  isLastSibling: true,
  children: {firstSibling: () => c1}
}

var b1 = {
  val: 'b1',
  nextSibling: () => b2
}

var a = {
  val: 'a',
  isLastSibling: true,
  children: {firstSibling: () => b1}
}

bfs(a, tree => console.log(tree.val))

【讨论】:

  • 是的,这正是我想要的!谢谢你:)
猜你喜欢
  • 2018-08-16
  • 1970-01-01
  • 2017-07-29
  • 1970-01-01
  • 2015-05-01
  • 2012-09-29
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
相关资源
最近更新 更多