当前位置: 首页 > 面试题库 >

JavaScript中嵌套对象结构中的递归树搜索

路和悌
2023-03-14
问题内容

我试图找出如何递归地在此JSON对象中搜索节点。我尝试了一些但无法获得的东西:

var tree = {
    "id": 1,
    "label": "A",
    "child": [
        {
            "id": 2,
            "label": "B",
            "child": [
                {
                    "id": 5,
                    "label": "E",
                    "child": []
                },
                {
                    "id": 6,
                    "label": "F",
                    "child": []
                },
                {
                    "id": 7,
                    "label": "G",
                    "child": []
                }
            ]
        },
        {
            "id": 3,
            "label": "C",
            "child": []
        },
        {
            "id": 4,
            "label": "D",
            "child": [
                {
                    "id": 8,
                    "label": "H",
                    "child": []
                },
                {
                    "id": 9,
                    "label": "I",
                    "child": []
                }
            ]
        }
    ]
};

这是我无法使用的解决方案,可能是因为当子节点在数组中时,第一个节点只是一个值:

function scan(id, tree) {
    if(tree.id == id) {
        return tree.label;
    }

    if(tree.child == 0) {
        return
    }

    return scan(tree.child);
};

问题答案:

您的代码只是缺少一个循环来检查child数组中节点的每个子节点。此递归函数将返回label节点的属性,或者undefined如果树中不存在标签,则返回该属性:

const search = (tree, target) => {

  if (tree.id === target) {

    return tree.label;

  }



  for (const child of tree.child) {

    const res = search(child, target);



    if (res) {

      return res;

    }

  }

};





var tree = {"id":1,"label":"A","child":[{"id":2,"label":"B","child":[{"id":5,"label":"E","child":[]},{"id":6,"label":"F","child":[]},{"id":7,"label":"G","child":[]}]},{"id":3,"label":"C","child":[]},{"id":4,"label":"D","child":[{"id":8,"label":"H","child":[]},{"id":9,"label":"I","child":[]}]}]};



console.log(search(tree, 1));

console.log(search(tree, 6));

console.log(search(tree, 99));

您还可以使用显式堆栈进行迭代,该堆栈更快,更凉爽并且不会导致堆栈溢出:

const search = (tree, target) => {

  const stack = [tree];



  while (stack.length) {

    const curr = stack.pop();



    if (curr.id === target) {

      return curr.label;

    }



    stack.push(...curr.child);

  }

};





var tree = {"id":1,"label":"A","child":[{"id":2,"label":"B","child":[{"id":5,"label":"E","child":[]},{"id":6,"label":"F","child":[]},{"id":7,"label":"G","child":[]}]},{"id":3,"label":"C","child":[]},{"id":4,"label":"D","child":[{"id":8,"label":"H","child":[]},{"id":9,"label":"I","child":[]}]}]};



for (let i = 0; ++i < 12; console.log(search(tree, i)));


 类似资料:
  • 我一直在用这个四叉树http://www.astroml.org/book_figures/chapter2/fig_quadtree_example.html 在一些数据上。但是我现在需要结果结构的嵌套表示。 其结构类似于: 这里的子元素是递归元素,它是一个列表,包括进一步的实例。最低深度没有子级(为0),是我想要访问的表示。因此,在这种情况下,我会访问数据 最终,我希望在最低级别的数据表示像:

  • 问题内容: 我试图返回一个像这样的JSON对象结构中的特定节点 因此,这是一个树状的儿童-父母关系。每个 节点 都有唯一的ID。我试图找到一个特定 节点 这样 我通过执行搜索。但是,即使搜索找到匹配项,该函数也会始终返回。我有一种不好的感觉,即递归函数在找到匹配项后不会停止并继续运行finally返回,因为在后者的递归执行中,它没有到达返回点,但是我不确定如何解决这个问题。 请帮忙! 问题答案:

  • 问题内容: 我有一个将位置链接在一起的数据库表;一个位置可以在一个位置,也可以在另一个位置内。 这是深入探讨MySQL / PHP的深度: 在给定父级位置的情况下,如何使用MySQL如何获得其所有后代位置,无论深度如何? 问题答案: mysql.com上有 一篇漂亮的文章 ,概述了管理分层数据的各种方法。我认为它为您的问题提供了完整的解决方案,并显示了各种不太简单但较快的方法(例如嵌套集)。

  • 问题内容: 我有两个结构: 它代表我的自定义PostgreSQL对象类型(我自己创建): 下一个结构是DB中的表: 我的自定义对象嵌套在Client类型中,名为。我尝试通过以下方式读取数据: 但不幸的是,我无法读取字段(具有默认值)。我不想使用google_account创建单独的表,也不希望将此结构作为客户端表中的单独字段或将其打包为json(创建单独的实体,因为该结构不仅在此表中使用,而且我正

  • 我想在一个带有递归的Javascript嵌套对象中找到一个值的键。 下面是我对函数的尝试。有没有更优雅的方法来实现这一点? null null 例如,有没有一种方法可以避免检查的值然后中断?我觉得result应该能够在调用堆栈中冒泡,直到它在第一次函数调用时返回,而不必中断。

  • 问题内容: 有没有一种方法(在jQuery或JavaScript中)循环遍历每个对象以及子对象和孙子对象等等? 如果是的话…我还能读他们的名字吗? 例: 所以循环应该做这样的事情… 问题答案: 您正在寻找循环: 请注意,循环将遍历任何可枚举的属性,包括那些添加到对象原型的属性。为了避免作用于这些属性,可以使用方法检查该属性是否仅属于该对象: 递归执行循环就像编写递归函数一样简单: