使用递归的JavaScript中的BFS

时间:2018-06-22 10:57:11

标签: 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)
  })
}

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

1 个答案:

答案 0 :(得分: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))