Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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_Algorithm_Recursion_Tree - Fatal编程技术网

JavaScript-如何在节点搜索中返回树的分支?

JavaScript-如何在节点搜索中返回树的分支?,javascript,algorithm,recursion,tree,Javascript,Algorithm,Recursion,Tree,我的数据结构如下所示: var tree = [ { id: 1, children: [] }, { id: 2, children: [ { id: 3, children: [] } ] } ]; 一个分支上可以有任意数量的节点或子节点 我的目标是从顶部(根)节点开始,搜索给

我的数据结构如下所示:

var tree = [
    {
        id: 1,
        children: []
    }, {
        id: 2,
        children: [
            {
                id: 3,
                children: []
            }
        ]
    }
];
一个分支上可以有任意数量的节点或子节点

我的目标是从顶部(根)节点开始,搜索给定节点并返回它所在的分支

在Plunker的例子中:

我想搜索节点id#31,因此算法将返回31所属的数组(分支)

我已经开始了这个算法,但是如果我递归地这样做,我不知道如何再次回溯

function traverse(branch) {

  for (var i = 0; i < branch.length; i++) {
    if (branch[i].id == node.id) {
      return branch;
    }
  }

  for (var j = 0; j < branch.length; j++) {
    if (branch[j].children.length > 0) {
      return traverse(branch[j].children);
    }
  }

}

console.log(traverse(tree));
函数遍历(分支){
对于(变量i=0;i0){
返回遍历(分支[j].子级);
}
}
}
console.log(遍历(树));
例如,如果我向下查看最后一个子节点而没有找到匹配项,那么我需要回溯到父分支以尝试下一组选项


如何修改算法以再次回溯?

您的算法非常接近,您只需添加一个
if
语句,以便它仅在找到匹配项时返回
遍历的递归结果:

function traverse(branch) {

  for (var i = 0; i < branch.length; i++) {
    if (branch[i].id == node.id) {
      return branch;
    }
  }

  for (var j = 0; j < branch.length; j++) {
    var result = traverse(branch[j].children);
    if (result !== undefined) {
      return result;
    }
  }

  return undefined; // no match found

}

console.log(traverse(tree));
函数遍历(分支){
对于(变量i=0;i
您可以对子项的结果使用临时变量,如果值为truthy,则退出循环

function traverse(branch) {
    var result;
    for (var i = 0; i < branch.length; i++) {
        if (branch[i].id === node.id) {
            return branch;
        }
        if (branch[j].children.length > 0) {
            result = traverse(branch[j].children);
            if (result) {
                return result;
            }
        }
    }
}
函数遍历(分支){
var结果;
对于(变量i=0;i0){
结果=遍历(分支[j]。子级);
如果(结果){
返回结果;
}
}
}
}

这样做的目的是返回分支而不是节点本身:

    function traverse(branch) {

        for (var i = 0; i < branch.length; i++) {
            if (branch[i].id == node.id) {
                return branch[i].children;
            }
        }

        for (var j = 0; j < branch.length; j++) {
            var result = traverse(branch[j].children);
            if (result !== null) {
                return result;
            }
        }

        return null; // no match found
    }
函数遍历(分支){
对于(变量i=0;i
如果找不到匹配项,您希望返回什么?如果递归调用找到某个内容,则只应返回其结果。在我的情况下,将始终找到匹配项,因为我将让用户单击其中一个以启动搜索过程。当然,但如果要使代码递归,则必须预期树的每个分支都不会包含匹配项,因此,在这种情况下,您必须返回一些内容。我如何修改算法,使其能够找到多个匹配项而不是一个匹配项?您需要
推入
结果的数组中,然后在最后返回
结果