2016-11-09 1 views
0

J'essaye de construire un itérateur sur JS qui prendra un arbre et à chaque itération retournera le prochain sous-arbre possible.Comment diviser un arbre sur tous les sous-arbres possibles?

Voici un exemple de l'arbre source:

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

Le résultat devrait être trois itérations

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

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

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

Quelqu'un pourrait-il me donner un indice ou d'un point à la direction de la façon dont ce problème pourrait être résolu?

Merci!

+0

Vous voulez dire que vous voulez tous les chemins possibles de la racine à la feuille de l'arbre? – abhishekkannojia

+0

J'ai besoin d'une copie de l'arbre, comme dans un exemple – Dimitry

Répondre

0

Je pense que la fonction récursive est votre réponse.

Quelque chose comme ça?

(Il a travaillé en utilisant votre exemple)

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

Merci beaucoup. J'ai essayé la récursivité mais le point clé était la fonction getTreeFromPath. Cela fonctionne comme vous l'avez suggéré, je l'ai juste réimplémenté en utilisant des générateurs: http://jsbin.com/gojisapica/edit?js,console – Dimitry

0

Cela va vous aider.

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>