2017-05-03 3 views
0

Je souhaite imprimer mon arborescence non binaire avec un cheminement de niveau. Dans le code ci-dessous, je mets un retrait chaque fois qu'un nouvel ensemble d'enfants a été ajouté, mais d'une manière ou d'une autre j'ai besoin de retirer les indentations quand je retourne dans l'arbre. Voilà comment cela imprime arbre:Indentation Java dans l'arborescence de l'ordre des niveaux, pas dans l'arborescence binaire

Root 
    Home 
    HomeChild1 
    HomeChild2 
    Documents (should be same level as Home) 
     DocumentChild1 
     DocumentChild2 
     Downloads (should be same level as Home and Documents) 
     DownloadsChild1 

Code:

queue.add(o); //root 
     int indent = 0; 
     while(!queue.isEmpty(){ 

      for(int i=0; i<indent; i++){ 
       print(" "); 
      } 

      Object tempObj = queue.remove(o); 
      print(tempObj.value); 

      if(tempObj.children != null){ 
       //Adding all childrens, since its not a binary tree I loop throught all children 
       for(int i=0; i<tempObj.children.length; i++){ 
        queue.add(0, tempObj.children[i]; 
       } 
       indent++; 
      } 
     } 

Voici ce que je veux ressembler

Root 
    Home 
    HomeChild1 
    HomeChild2 
    Documents 
    DocumentChild1 
    DocumentChild2 
    Downloads 
    DownloadsChild1 

Répondre

1

Vous devez incrémenter le retrait lorsque vous commencez à traiter des enfants, puis le décrémenter lorsque vous atteignez la fin d'un groupe d'enfants.

Vous feriez mieux de faire tout cela en utilisant quelque chose comme un appel récursif plutôt que la file d'attente si. La file d'attente ajoute beaucoup de complexité et n'aide pas.

Quelque chose comme:

recurseTree(Thing obj, String indent) { 
    print(indent+obj.value); 
    if (obj.children != null) { 
     for (Thing child: obj.children) { 
      recurseTree(child, indent+" "); 
     } 
    } 
} 

Vous pouvez faire quelques optimisations ici (par exemple seulement faire la concatonation chaîne une fois) et vous aurez besoin de faire un peu de rangement, mais que vous devez donner le cadre de base que vous avoir besoin.

démarrer en

recurseTree(root, ""); 
+0

Merci! Fonctionne bien maintenant, bizarre je n'ai pas trouvé une solution récursive quand j'ai cherché Java Breadth-premier algorithme xD –

+0

@SimonAndersson Ceci est l'un des cas d'utilisation classiques pour la récursivité, donc je suis surpris que rien ne vient. –

+0

Oui, mais le Depths-premier est beaucoup plus commun, c'est peut-être pourquoi –

0

Vous ne réinitialiser votre valeur de retrait. Vous devez copier sa valeur pour pouvoir la restaurer après avoir traversé un groupe d'enfants

Btw, si vous essayez quelque chose de récursif, c'est plus facile à gérer.

+0

D'abord en boucle, il ajoute tous les niveaux 1 enfants à la file d'attente, (maison, documents, téléchargements). et la boucle suivante supprime la maison et ajouter tous les enfants des maisons d'abord dans la file d'attente, je ne sais pas où j'ai besoin pour réinitialiser la valeur de retrait –

+0

Tim B algorithme est tout simplement le meilleur pour faire ce que vous essayez d'atteindre. – rilent