我正在为广度优先搜索算法编写函数。我会想出以下代码
traverseBF() {
const results = []
const queue = [this.root]
while (queue.length) {
let node = queue.shift()
if (node.children) {
queue.push(...node.children)
}
results.push(node)
}
return results
}
但是,解决方案的写法有些不同
traverseBF(fn) {
const queue = [this.root]
while (queue.length) {
let node = queue.shift()
if (node.children) {
queue.push(...node.children)
}
fn(node)
}
}
我无法解释fn(node)
的目的是什么或它如何返回正确的结果。这是某种递归调用吗?两种解决方案有何不同?
不是像您一样返回结果,而是允许用户传递一个函数,该函数在遍历每个节点时都会传递它。
例如尝试:
obj.traverseBF(node => console.log(node))
或者只是
obj.traverseBF(console.log)
也应该工作。 console.log
被赋予每个要使用的节点。
这可以说是更普遍的用途。如果树很大,那么如果用户不需要一次所有结果,将所有结果存储在列表中可能会浪费内存。