2017-10-07 3 views
1
public void Print() { 
     Print(root, 4); 
    } 

    private void Print(Node node, int padding) { 
     if (node != null) { 
      if (node.rChild != null) { 
       Print(node.rChild, padding + 4); 
      } 
      if (padding > 0) { 
       Console.Write(" ".PadLeft(padding)); 
      } 
      if (node.rChild != null) { 
       Console.Write("/\n"); 
       Console.Write(" ".PadLeft(padding)); 
      } 
      Console.Write(node.value.ToString() + "\n "); 
      if (node.lChild != null) { 
       Console.Write(" ".PadLeft(padding) + "\\\n"); 
       Print(node.lChild, padding + 4); 
      } 
     } 
    } 

Ce code renvoie une console de connexion au format sympa. comme ci-dessousConversion de méthode Void en chaîne avec des méthodes imbriquées

 6 
    /
    5 
    \ 
     4 
/
3 
\ 
    2 
    \ 
     2 

maintenant quand je convertir le vide au format de la chaîne, il devient désordonné et il ne semble pas fonctionner. puisque j'ai des méthodes imbriquées.

Je suis actuellement perdu dans la conversion du vide à chaîne

+1

Où est le code que vous avez essayé? Nous ne pouvons pas vous dire comment y remédier si vous ne nous montrez pas. – JLRishe

+0

il suffit d'ajouter un tas de variables et retourne l'un dans l'autre et en changeant le void en String. le code que j'ai écrit est hors sujet et en théorie ne devrait pas fonctionner – Bamuel

Répondre

1

Une façon concise d'aborder ce serait:

  1. Remplacer chacun de vos déclarations if une déclaration sous condition que soit produit la substance dans l'instruction if ou une chaîne vide.
  2. Mélanger tous les morceaux ensemble en utilisant +
  3. Retour le résultat

qui vous donnerait ceci:

private string Print(Node node, int padding) 
{ 
    if (node != null) 
    { 
     return 
      (node.rChild != null 
       ? Print(node.rChild, padding + 4) 
       : "") + 
      (padding > 0 
       ? " ".PadLeft(padding) 
       : "") + 
      (node.rChild != null 
       ? "/\n" + " ".PadLeft(padding) 
       : "") + 
      node.value.ToString() + "\n " + 
      (node.lChild != null 
       ? " ".PadLeft(padding) + "\\\n" + Print(node.lChild, padding + 4) 
       : ""); 
    } 

    return ""; 
} 
2

Ainsi, au lieu d'imprimer les valeurs, vous voulez revenir l'arbre comme une chaîne.

Eh bien, pour ce faire, il vous suffit de changer chaque appel de méthode Console.Write pour ajouter la chaîne de votre imprimions à une grande chaîne, et chaque appel de méthode Print pour ajouter la valeur de retour de Print à une grande chaîne. Et à la fin de retour cette grande chaîne

En gros, imaginez la « grande chaîne » est la console.

Vous pouvez utiliser la classe StringBuilder comme cette grande chaîne que je parle. Créons-en un au début de la méthode d'impression:

StringBuilder sb = new StringBuilder(); 

Maintenant nous devons rechercher ces deux modèles et les changer.

Nous changeons:

Console.Write(XXX); 

à

sb.Append(XXX); 

et le changement

Print(XXX, XXX); 

à

sb.Append(Print(XXX, XXX)) 

Maintenant, la méthode ressemble à ceci:

private string Print(Node node, int padding) { 
    StringBuilder sb = new StringBuilder(); 
    if (node != null) { 
     if (node.rChild != null) { 
      sb.Append(Print(node.rChild, padding + 4)); 
     } 
     if (padding > 0) { 
      sb.Append(" ".PadLeft(padding)); 
     } 
     if (node.rChild != null) { 
      sb.Append("/\n"); 
      sb.Append(" ".PadLeft(padding)); 
     } 
     sb.Append(node.value.ToString() + "\n "); 
     if (node.lChild != null) { 
      sb.Append(" ".PadLeft(padding) + "\\\n"); 
      sb.Append(Print(node.lChild, padding + 4)); 
     } 
    } 
    return sb.ToString(); 
} 

Après cela, vous devriez être en mesure de changer la méthode Print pour revenir sans paramètre une chaîne sur votre propre.