首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >javascript将分层树拆分为所有子树,并将每个子树的节点按其级别分组。

javascript将分层树拆分为所有子树,并将每个子树的节点按其级别分组。
EN

Stack Overflow用户
提问于 2014-10-27 20:10:03
回答 1查看 1.9K关注 0票数 0

我有一个层次结构数据,可以看作是一个树结构。

First

我需要把这个层次树分解成子树,得到所有的子树。下面的功能是我所做的,它工作得很好。

代码语言:javascript
复制
            var hierarchObjects = [];
            traverseNodes(root);
            function traverseNodes(root){
                hierarchObjects.push(root);
                for(var i=0; i<root.children.length; ++i)
                {
                    traverseNodes(root.children[i]);
                }
            }

第二

我需要在数组hierarchObjects中对子树的每个级别的节点进行分组。子树的深度是不同的。

例如,

将level1子树的节点放置在数组Level1中。

将level2子树的节点放置在数组Level2中。

那么,我应该为Second过程做些什么呢?

是否有一种更有效的方法来解决整个过程?

因为我的数据集有点大,而且有大约1300棵子树,我需要找到一种有效的方法?

我的数据集是树结构:http://www.csee.umbc.edu/~yongnan/untitled/pathwayHierarchy.json

你可以看到它是一个parent-children结构树。

对于这棵树,我使用步骤1分裂成子树。对于每个子树,例如如下所示:

1

代码语言:javascript
复制
  {
        "dbId": "111461",
        "name": "Cytochrome c-mediated apoptotic response",
        "children": [
            {
                "dbId": "111458",
                "name": "Formation of apoptosome",
                "children": [],
                "size": 1
            },
            {
                "dbId": "111459",
                "name": "Activation of caspases through apoptosome-mediated cleavage",
                "children": [],
                "size": 1
            }
        ]
    }

对于这个子树,它只有两个子level1,所以返回数组应该是[形成凋亡体,通过凋亡体介导的分裂激活caspase]。

2

代码语言:javascript
复制
 {
        "dbId": "111471",
        "name": "Apoptotic factor-mediated response",
        "children": [
            {
                "dbId": "111461",
                "name": "Cytochrome c-mediated apoptotic response",
                "children": [
                    {
                        "dbId": "111458",
                        "name": "Formation of apoptosome",
                        "children": [],
                        "size": 1
                    },
                    {
                        "dbId": "111459",
                        "name": "Activation of caspases through apoptosome-mediated cleavage",
                        "children": [],
                        "size": 1
                    }
                ]
            },
            {
                "dbId": "111469",
                "name": "SMAC-mediated apoptotic response",
                "children": [
                    {
                        "dbId": "111463",
                        "name": "SMAC binds to IAPs ",
                        "children": [],
                        "size": 1
                    },
                    {
                        "dbId": "111464",
                        "name": "SMAC-mediated dissociation of IAPcaspase complexes ",
                        "children": [],
                        "size": 1
                    }
                ]
            }
        ]
    }

对于此数据集,结果可能是

[细胞色素c介导的凋亡反应,SMAC介导的凋亡反应,凋亡小体的形成,通过凋亡小体介导的裂解激活caspase,SMAC与IAPs结合,SMAC介导IAPcaspase复合物的解离]

现在,我尝试使用宽度第一算法来做第二步。我知道效率不是很好。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-29 17:12:14

这应该是可行的,除非您处理大约1m个节点或非常深的树,否则应该非常快:

代码语言:javascript
复制
var data={
    //your data
}


var arr=[]; // array that holds an array of names for each sublevel

function traverse(data, level){
    if(arr[level]==undefined) arr[level]=[]; // if its the first time reaching this sub-level, create array
    arr[level].push(data.name); // push the name in the sub-level array
    for(var index=0;index<data.children.length;index++){ // for each node in children
        traverse(data.children[index], level+1); // travel the node, increasing the current sub-level
    }
}

traverse(data, 0); // start recursive function
console.log(arr)

全小提琴:http://jsfiddle.net/juvian/fmhrpdbf/1/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26595966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档