我正在做一些工作,涉及以树状结构抓取一些特定的节点。我的同事声称,我正在尝试使用堆栈和DFS算法的实现不是这样。
这是我使用堆栈创建基本DFS算法的实现:
const findMatchingElements = (node, name, result) => {
for(const child of node.children) {
findMatchingElements(child, name, result)
}
if(node.name === name) result.push(node)
return result
}
const getElements = (tree, name) => {
return findMatchingElements(tree, name, [])
}
getElements(obj, 'foo')
以及示例输入:
const obj = {
id: 1,
name: 'foo',
children: [
{
id: 45,
name: 'bar',
children: [
{
id: 859,
name: 'bar',
children: []
}
]
},
{
id: 67,
name: 'foo',
children: [
{
id: 456,
name: 'bar',
children: []
},
{
id: 653,
name: 'foo',
children: []
}
]
}
]
}
我正在获得预期的输出:
[ { id: 653, name: 'foo', children: [] },
{ id: 67, name: 'foo', children: [ [Object], [Object] ] },
{ id: 1, name: 'foo', children: [ [Object], [Object] ] } ]
我也希望按顺序进行,但是我的同事出于某种原因认为这不是适当的堆栈实现。我想念什么吗?是因为最终答案的打印方式吗?对我来说,感觉就像是一个堆栈。
答案 0 :(得分:1)
对于您在这里的不同之处,我有些困惑,但是如果您同意一旦客户端开始使用它是LIFO,那么对于我来说,输出就好像是一个堆栈。 现在,它只是一个JavaScript数组,但是如果您开始对其进行推送和弹出操作,并且仅这样做,那么它就是堆栈的JavaScript实现。
答案 1 :(得分:0)
您正在通过递归隐式使用堆栈。我想您的同事意味着您的实现不会在没有递归的情况下显式使用堆栈。
答案 2 :(得分:0)
由于递归函数中各行的顺序,因此您在DFS中使用了后序遍历。在您的实现中,没有按顺序的东西。您的同事可能一直在预定DFS。要将算法转换为预订算法,只需在访问子节点之前检查该节点即可。
const findMatchingElements = (node, name, result) => {
if(node.name === name) result.push(node)
for(const child of node.children) {
findMatchingElements(child, name, result)
}
return result
}