Javascript 什么';这个在树中查找节点的简单递归函数有什么问题?
我有一个典型的树形结构,如下所示:Javascript 什么';这个在树中查找节点的简单递归函数有什么问题?,javascript,typescript,recursion,Javascript,Typescript,Recursion,我有一个典型的树形结构,如下所示: [ { id: 42, ...other properties..., subs: [ ...other objects... ] }, ...other objects... ] 它可以有任何形状和数量的节点 我编写了一个方法,该方法应根据节点的id递归地从树中查找并返回节点: private getFromTree(id: number): object { function f(tree: Arra
[
{
id: 42,
...other properties...,
subs:
[ ...other objects... ]
},
...other objects...
]
它可以有任何形状和数量的节点
我编写了一个方法,该方法应根据节点的id
递归地从树中查找并返回节点:
private getFromTree(id: number): object {
function f(tree: Array<object>): object {
for (let n of tree) {
if (n['id'] == id) return n;
else if (n['subs'].length > 0) f(n['subs']);
}
}
return f(this.tree);
}
私有getFromTree(id:number):对象{
函数f(树:数组):对象{
for(让n代表树){
如果(n['id']==id)返回n;
如果(n['subs'].长度>0)f(n['subs']);
}
}
返回f(这个树);
}
但它不起作用,我想知道为什么
(如果我用console.log(JSON.stringify(n));
替换return n;
,那么我可以看到它找到了节点,但是使用return n;
它总是返回未定义的。首先我认为这是因为我在f(n['subs')之前缺少了第二个return
);
但如果我把它放在那里,它将只搜索树中的一条路径。)
为什么错了?如果找到节点,为什么会返回undefined
?我该如何重写它才能正常工作呢?您错过了报税表。当您递归时,必须返回递归的结果,否则内部调用的返回值将丢失
我错过了一个细节,你有一个数组的元素,每个都有子。。。那个使事情复杂化。您是否保证id
只能出现一次?如果是的话,这个版本就可以了。如果否,您如何知道哪个元素是该id的正确元素
private getFromTree(id: number): object {
function f(tree: Array<object>): object {
for (let n of tree) {
if (n['id'] == id) return n;
else if (n['subs'].length > 0) {
let candidate = f(n['subs']);
if (candidate != undefined) return candidate;
}
}
}
return f(this.tree);
}
私有getFromTree(id:number):对象{
函数f(树:数组):对象{
for(让n代表树){
如果(n['id']==id)返回n;
else if(n['subs'].长度>0){
设候选者=f(n['subs']);
如果(候选者!=未定义)返回候选者;
}
}
}
返回f(这个树);
}
您缺少报税表。当您递归时,必须返回递归的结果,否则内部调用的返回值将丢失
我错过了一个细节,你有一个数组的元素,每个都有子。。。那个使事情复杂化。您是否保证id
只能出现一次?如果是的话,这个版本就可以了。如果否,您如何知道哪个元素是该id的正确元素
private getFromTree(id: number): object {
function f(tree: Array<object>): object {
for (let n of tree) {
if (n['id'] == id) return n;
else if (n['subs'].length > 0) {
let candidate = f(n['subs']);
if (candidate != undefined) return candidate;
}
}
}
return f(this.tree);
}
私有getFromTree(id:number):对象{
函数f(树:数组):对象{
for(让n代表树){
如果(n['id']==id)返回n;
else if(n['subs'].长度>0){
设候选者=f(n['subs']);
如果(候选者!=未定义)返回候选者;
}
}
}
返回f(这个树);
}
id
s是唯一的,所以这不会成为问题。谢谢你,你的解决方案很好。我唯一能理解为什么只有a返回f(n['subs'])代码>在内,否则不足。如果没有候选者!=未定义
条件它将在遍历不匹配的路径后停止,并返回未定义
?这是通过检查防止的情况吗。。因此,return
仍然存在,以便内部调用不会丢失,它只是有条件的。这就是我的解释。我说得对吗?@汤姆-是的,没错。如果您有某个根元素是所有元素的共同祖先,那么您可能不需要条件检查。但是因为您的基本元素是一个树数组([{…},{…}]
),我们必须做一些事情来确保如果我们到达第一棵树的底部,并且没有找到我们想要的结果,我们会检查后续的树。这是深度优先递归。id
s是唯一的,所以这不会成为问题。谢谢你,你的解决方案很好。我唯一能理解为什么只有a返回f(n['subs'])代码>在内,否则不足。如果没有候选者!=未定义
条件它将在遍历不匹配的路径后停止,并返回未定义
?这是通过检查防止的情况吗。。因此,return
仍然存在,以便内部调用不会丢失,它只是有条件的。这就是我的解释。我说得对吗?@汤姆-是的,没错。如果您有某个根元素是所有元素的共同祖先,那么您可能不需要条件检查。但是因为您的基本元素是一个树数组([{…},{…}]
),我们必须做一些事情来确保如果我们到达第一棵树的底部,并且没有找到我们想要的结果,我们会检查后续的树。这是深度优先递归。