如何在从根遍历到json树的目标节点时插入键?

Posted

技术标签:

【中文标题】如何在从根遍历到json树的目标节点时插入键?【英文标题】:How to insert key while traversing from root to the destination node of a json tree? 【发布时间】:2020-03-27 00:54:42 【问题描述】:

假设我的 JSON 树将具有如下结构

 var tree = [
        iriID: "/api/catalogs/7",
        id: 7,
        name: "drywall",

        children: [
                iriID: "/api/catalogs/11",
                id: 11,
                name: "Vipuls catalog",

                children: [
                        iriID: "/api/catalogs/10",
                        id: 10,
                        name: "test catalog 3",

                        children: []
                    ,
                    
                        iriID: "/api/catalogs/9",
                        id: 9,
                        name: "test catalog",

                        children: []
                    
                ]
            ,

        ]
    ,


];

我想在从第一个节点遍历到具有 id=9 的节点时插入一个键 travelled=true 。最终输出应如下所示。

      var tree = [
        iriID: "/api/catalogs/7",
        id: 7,
        name: "drywall",
        traversed: true,
        children: [
                iriID: "/api/catalogs/11",
                id: 11,
                name: "Vipuls catalog",
                traversed: true,
                children: [
                        iriID: "/api/catalogs/10",
                        id: 10,
                        name: "test catalog 3",

                        children: []
                    ,
                    
                        iriID: "/api/catalogs/9",
                        id: 9,
                        name: "test catalog",
                        traversed: true,
                        children: []
                    
                ]
            ,

        ]
    ,


];

希望你能理解我的要求。只需确保查找最短路径的代码经过优化且功能良好。

【问题讨论】:

child.traversed = true?或者让 Vue 接受更改,this.$set(child, 'traversed', true)。遍历树的代码在哪里? 你真的需要/想要修改你的树吗?将您的遍历信息保存在一个单独的结构中会更明智。 是的,无论您找到哪种方式,请分享,修改也可以 奇怪你的树是一个数组?由于一棵树只有一个根,如果这个数组有两个或多个元素意味着什么? 【参考方案1】:

我会使用递归函数来收集到目标节点路径上的节点。然后,您可以决定对该路径上的节点执行您想要的操作,例如给他们额外的财产:

function getPathTo(nodes, id) 
    for (let node of nodes) 
        if (node.id === id) return [node];
        let path = getPathTo(node.children || [], id);
        if (path) return [node, ...path];
    


// Demo
var tree = [iriID: "/api/catalogs/7",id: 7,name: "drywall",children: [iriID: "/api/catalogs/11",id: 11,name: "Vipuls catalog",children: [iriID: "/api/catalogs/10",id: 10,name: "test catalog 3",children: [], iriID: "/api/catalogs/9",id: 9,name: "test catalog",children: []]]];
let path = getPathTo(tree, 9) || [];
console.log(path.map(node => node.id));
path.forEach(node => node.traversed = true);
console.log(tree);

【讨论】:

【参考方案2】:

可以通过递归遍历来实现。

function modify(ob, id) 
    if(ob.id == id) 
        ob[traversed] = true
     else 
        for(var i=0;i<ob.children.length;i++)
            modify(ob.children[i],id);
        
    

【讨论】:

您的尝试很有用,但没有产生上述结果。

以上是关于如何在从根遍历到json树的目标节点时插入键?的主要内容,如果未能解决你的问题,请参考以下文章

113. 路径总和 II-二叉树的中序遍历

遍历和提取​​树的节点时出现问题?

算法 | 二叉树的堂兄弟节点

set

Java 求解二叉树的所有路径

树的插入删除旋转归纳