Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript --这是广度优先还是深度优先搜索的一个例子?_Javascript_Computer Science - Fatal编程技术网

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

Javascript --这是广度优先还是深度优先搜索的一个例子?,javascript,computer-science,Javascript,Computer Science,下面是一个遍历整个文档对象模型的简单函数。我想了解这是广度优先还是深度优先,以及如何理解原因: var traverseDOM = function () { function traverse (parent) { // mark 1 _(parent.childNodes).forEach((child) => { traverse(child); } // mark 2 } traverse(document.body); }

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

var traverseDOM = function () {
  function traverse (parent) {
    // mark 1
    _(parent.childNodes).forEach((child) => {
      traverse(child);
    }
    // mark 2
  }
  traverse(document.body);
}
这似乎是从这一相关领域进行的深度优先搜索

它可以进一步分类根据


按序、前序和后序。

正如Eugene提到的,这是深度优先搜索算法的一个例子。如果您注意到第4行,它正在使用递归并传递它搜索的第一个子项:

    `traverse(child);`
对于父节点中的每个子节点,这一行被称为

更新:为清晰起见添加注释:
“一旦它得到“第一个”子节点,它就会再次调用该子节点上的遍历函数,迫使系统向下运行,直到到达节点。”

正如Eugene所提到的,这是深度优先搜索算法的一个示例。如果您注意到第4行,它正在使用递归并传递它搜索的第一个子项:

    `traverse(child);`
对于父节点中的每个子节点,这一行被称为

更新:为清晰起见添加注释:
一旦它得到“第一个”子节点,它将再次调用该子节点上的遍历函数,迫使系统向下运行,直到它碰到一个节点为止。

考虑以下树:

遍历(1)
开始:

在“标记1”之后,该方法将开始在所有子节点上循环,为每个子节点调用
travel
。第一次,
导线测量(1.1)
,将“在执行过程中插入”:

遍历(1.1)
点击“标记1”时,它将开始执行其子项并调用
遍历(1.1.1)

由于“1.1.1”没有任何子项,
遍历(1.1.1)
到达“标记2”,执行流将返回父方法
遍历(1.1)
forEach
循环:

循环继续,将为第二个子项“1.1.2”调用
遍历

处理完“1.1”的两个子项后,
遍历(1.1)
到达“标记2”,执行流现在回到
遍历(1)
forEach
循环中:

继续执行“1.2”:


我就到此为止,但你应该掌握窍门。您可以看到,“1.1.1”和“1.1.2”是在“1.2”之前访问的,这使其成为深度优先搜索。广度优先搜索将访问“1.1.1”之前的“1.2”和“1.3”。

考虑以下树:

遍历(1)
开始:

在“标记1”之后,该方法将开始在所有子节点上循环,为每个子节点调用
travel
。第一次,
导线测量(1.1)
,将“在执行过程中插入”:

遍历(1.1)
点击“标记1”时,它将开始执行其子项并调用
遍历(1.1.1)

由于“1.1.1”没有任何子项,
遍历(1.1.1)
到达“标记2”,执行流将返回父方法
遍历(1.1)
forEach
循环:

循环继续,将为第二个子项“1.1.2”调用
遍历

处理完“1.1”的两个子项后,
遍历(1.1)
到达“标记2”,执行流现在回到
遍历(1)
forEach
循环中:

继续执行“1.2”:



我就到此为止,但你应该掌握窍门。您可以看到,“1.1.1”和“1.1.2”是在“1.2”之前访问的,这使其成为深度优先搜索。广度优先搜索将在“1.1.1”之前访问“1.2”和“1.3”。

这是DFS。BFS并不是那么简单。手动执行它,看看它处理树中节点的顺序。顺便说一句,对于循环图来说,它不会终止…问题是你是否理解DFS或BFS,还是你只想理解这个特定的示例?@pedromss它正在遍历DOM,这是一个层次结构,不允许循环。这是DFS。BFS并不是那么简单。手动执行它,看看它处理树中节点的顺序。顺便说一句,对于循环图来说,它不会终止…问题是你是否理解DFS或BFS,还是你只想理解这个特定的示例?@pedromss它正在遍历DOM,这是一个层次结构,不允许循环。虽然正确,但这不是很好的推理,或者它没有完全推理出来。广度优先搜索也将遍历子节点。每次命中第一个子节点是它做的第一件事,因此它会深入asap@Amy,一旦它得到“第一个”子节点,它就会再次调用该子节点上的遍历函数,迫使系统向下运行,直到到达节点为止。让我更新我的答案。谢谢你指出。@user3815252别跟我解释。充实你答案中的推理。虽然正确,但这不是一个好的推理,或者没有充分的推理。广度优先搜索也将遍历子节点。每次命中第一个子节点是它做的第一件事,因此它会深入asap@Amy,一旦它得到“第一个”子节点,它就会再次调用该子节点上的遍历函数,迫使系统向下运行,直到到达节点为止。让我更新我的答案。谢谢你指出。@user3815252别跟我解释。在你的答案中充实推理。你用什么工具画这张图?伟大的解释和伟大的工作!你用什么工具画这张图?伟大的解释和伟大的工作!
traverse(1)
traverse(1.1)
traverse(1)
traverse(1.1)
traverse(1.1.1)
traverse(1)
traverse(1.1)
traverse(1)
traverse(1.1)
traverse(1.1.2)
traverse(1)
traverse(1)
traverse(1.2)