- 这是广度优先或深度优先搜索的一个例子吗?

时间:2017-08-24 20:49:19

标签: javascript computer-science

这是一个遍历整个文档对象模型的简单函数。我想要了解这是广度优先还是深度优先以及如何理解原因:

var traverseDOM = function () {
  function traverse (parent) {
    // mark 1
    _(parent.childNodes).forEach((child) => {
      traverse(child);
    }
    // mark 2
  }
  traverse(document.body);
}

这似乎是深度优先搜索此相关的SO Post

可以根据wikipedia对其进行进一步分类。

InOrder,PreOrder和PostOrder。

2 个答案:

答案 0 :(得分:3)

考虑以下树:

Initial tree

您从traverse(1)开始:

traverse(1)

traverse(1)

在“标记1”之后,该方法将开始循环遍历所有子节点,为每个子节点调用traverse。第一个,traverse(1.1),将“插入执行”:

traverse(1)
traverse(1.1)

traverse(1.1)

traverse(1.1)点击“标记1”时,它将开始子项并致电traverse(1.1.1)

traverse(1)
traverse(1.1)
traverse(1.1.1)

traverse(1.1.1)

由于“1.1.1”没有任何子节点,traverse(1.1.1)到达“标记2”,执行流将返回到父方法forEach的{​​{1}}循环:< / p>

traverse(1.1)

traverse(1.1)

循环继续,并且将为第二个孩子“1.1.2”调用traverse(1) traverse(1.1)

traverse

traverse(1.1.2)

处理完两个“1.1”的子项后,traverse(1) traverse(1.1) traverse(1.1.2) 达到“标记2”,执行流程现在回到traverse(1.1)的{​​{1}}循环中:

forEach

traverse(1)

继续“1.2”:

traverse(1)

traverse(1.2)

我会在这里停下来,但你应该掌握它。您可以看到“1.1.1”和“1.1.2”在“1.2”之前被访问,使其成为深度优先搜索。广度优先搜索将在“1.1.1”之前访问“1.2”和“1.3”。

答案 1 :(得分:1)

正如尤金所说,它是深度优先搜索算法的一个例子。如果你在第4行注意到它正在使用递归并传递它搜索过的第一个孩子:

    `traverse(child);`

并且此行在父节点中被称为for each child

更新:为了清晰起见,添加评论: “一旦它获得”第一个“子节点,它就会再次调用该子节点上的遍历函数,强制系统向下移动直到它到达节点。”