2016-11-09 3 views
0

Я пытаюсь построить итератор на 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', 
    } 
    ] 
} 

Может кто-нибудь дать мне подсказку или точку в правильном направлении, как эта проблема может быть решена?

Спасибо!

+0

Вы имеете в виду, что вы хотите все возможные пути от корня к листу дерева? – abhishekkannojia

+0

Мне нужна копия дерева, как в примере – Dimitry

ответ

0

Я думаю, что рекурсивная функция ваш ответ.

Что-то вроде этого?

(Он работал, используя ваш пример)

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, []); 
+0

Большое спасибо. Я пробовал рекурсию, но ключевым моментом была функция getTreeFromPath. Он работает так, как вы предлагали, я просто переопределял его с помощью генераторов: http://jsbin.com/gojisapica/edit?js,console – Dimitry

0

Это поможет вам.

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]); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Смежные вопросы