【问题标题】:How to split a tree on all possible subtrees?如何在所有可能的子树上拆分树?
【发布时间】:2016-11-09 13:02:48
【问题描述】:

我正在尝试在 JS 上构建一个迭代器,它将采用一棵树并在每次迭代时返回下一个可能的子树。

这里是源码树的例子:

{
  name: 'A',
  children: [
    {
      name: 'B',
      children: [
        {
          name: 'E'
        },
        {
          name: 'F'
        },
      ]
    },
    {
      name: 'C',
    }
  ]
}

结果应该是三个迭代

1. {
  name: 'A',
  children: [ 
    { 
      name: 'B', 
      children: [ 
        {
          name: 'E'
        } 
      ]
    }
  ]
}

2. {
  name: 'A',
  children: [ 
    { 
      name: 'B', 
      children: [ 
        {
          name: 'F'
        } 
      ]
    }
  ]
}

3. {
  name: 'A',
  children: [ 
    { 
      name: 'C', 
    }
  ]
}

有人可以给我一个提示或指出如何解决这个问题的正确方向吗?

谢谢!

【问题讨论】:

  • 你的意思是说你想要从树根到叶子的所有可能路径?
  • 我需要一个树的副本,例如示例

标签: javascript graph tree traversal


【解决方案1】:

我认为递归函数是你的答案。

这样的?

(使用您的示例有效)

var newtrees = [];

var getTreeFromPath = function(path) {
   var newtree = {};
   var next = newtree;
   for (var i = 0 ; i < path.length;i++) {
       next.name = path[i].name;
       if (path[i].children) {
          var nextIteration = {};
          next.children = [nextIteration];
       }
       next = nextIteration;
   }
   return newtree;

}
var iterateNode = function(node, pathToNode) {
   if (!node.children) { 
       pathToNode.push(node);
       newtrees.push(getTreeFromPath(pathToNode));
   } else {
       pathToNode.push(node);
       for (var i = 0;i < node.children.length;i++) {

          iterateNode(node.children[i], pathToNode);
       }
   }
};
iterateNode(tree, []);

【讨论】:

  • 非常感谢。我试过递归,但关键是 getTreeFromPath 函数。它按照您的建议工作,我只是使用生成器重新实现它:jsbin.com/gojisapica/edit?js,console
【解决方案2】:

这会对你有所帮助。

var arry=[];
var obj={
  name: 'A',
  children: [
    {
      name: 'B',
      children: [
        {
          name: 'E'
        },
        {
          name: 'F'
        },
      ]
    },
    {
      name: 'C',
    }
  ]
};
    for(i=0;i<obj.children.length;i++)
    {
    var newObj={name:obj.name,children:[{name:obj.children[i].name}]};
    if(obj.children[i].children){
       for(j=0;j<obj.children[i].children.length;j++)
       {
         var newObj={name:obj.name,children:[{name:obj.children[i].name,children:          []}]};
         newObj.children[i].children[0]= {name: obj.children[i].children[j].name};
         arry.push(newObj);
      }
}
     else{
        arry.push(newObj);
     }
}
for(k=0;k<arry.length;k++){
    console.log(arry[k]);
}
&lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"&gt;&lt;/script&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-28
    • 2022-01-16
    • 2014-12-23
    • 1970-01-01
    • 1970-01-01
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多