2017-05-11 1 views
2

Dans le cadre de ma tâche, un arbre d'expression m'a été attribué et je dois le convertir en correctif avec O (n) d'exécution. Par exemple,Création d'une chaîne de données de post-commande d'un arbre donné

given tree

Pour convertir cet arbre "((1 V (2 H (3 V 4))) H (5 V 6))". Je ne pensais pas à un moyen de le convertir directement en infixe, alors j'ai pensé à le convertir en post-fix et en in-fix. (S'il y a une meilleure façon, dites-le moi).

Maintenant, mon problème est de convertir l'arbre en commande. J'ai essayé les suivantes:

private String treeToPost(Node node, String post) { 
    if (node != null) { 
     treeToPost(node.left, post); 
     treeToPost(node.right, post); 
     post = post + node.data.getName(); 
    } 
    return post; 
} 

Maintenant, j'ai deux problèmes avec cette méthode, la première est que cela ne fonctionne pas, car il enregistre uniquement le dernier nœud, il a voyagé, le second est que je suis pas sûr qu'il fonctionnera à O (n) car il devra créer une nouvelle chaîne à chaque fois. J'ai trouvé une solution à ce problème, mais elle utilisait StringBuilder que je ne suis pas autorisé à utiliser. J'ai pensé à faire un tableau de caractères pour enregistrer les données, mais parce que je ne connais pas la taille de l'arbre, je ne peux pas connaître la taille du tableau nécessaire. Merci pour votre temps :)

+0

Votre algorithme enregistre uniquement le dernier nœud car vous ne sauvegardez pas les résultats de treeToPost (node.left, post) et treeToPost (node.right, post) – dehasi

+0

Vous pouvez utiliser un inorder-traversal et insérer les valeurs de chaque nœud ils apparaissent dans l'arbre et insèrent une parenthèse ouvrante chaque fois que vous descendez d'un niveau (vers les feuilles) et un crochet de fermeture chaque fois que vous montez d'un niveau. Et c'est à peu près la façon dont vous créez une représentation infixée de votre arbre. Bien sûr, cela introduirait des parenthèses avec un seul terme à l'intérieur, mais ce n'est pas trop difficile à corriger, si nécessaire. – Paul

Répondre

2

Aller directement à l'infixe est probablement plus facile, il suffit d'ajouter toujours des parenthèses.

Deuxièmement, faire quelque chose comme ceci sauvera tous les nœuds:

private String treeToPost(Node node) { 
    String returnString = ""; 
    if (node != null) { 
     returnString += treeToPost(node.left); 
     returnString += treeToPost(node.right); 
     returnString += node.data.getName(); 
    } 
    return returnString; 
} 

Pour infix, cela devrait fonctionner

private String treeToPost(Node node) { 
    String returnString = ""; 
    if (node != null) { 
     returnString += "(" + treeToPost(node.left); 
     returnString += node.data.getName(); 
     returnString += treeToPost(node.right) + ")"; 
    } 
    return returnString; 
} 

Ces deux objets font nouvelle chaîne à chaque fois. Donc, je pense que c'est techniquement O (n^2), parce que la chaîne se développe à chaque fois, mais aucun de mes professeurs ne déduirait de points pour cela. Cependant, si vous voulez éviter ce comportement, vous ne pouvez pas utiliser StringBuilder. Vous pouvez utiliser un CharArrayWriter. C'est un tampon qui se développe dynamiquement. Vous pouvez ensuite faire deux méthodes. Celui qui s'ajoute à la mémoire tampon et ne renvoie rien. Et celui qui renvoie une chaîne. Vous appelez alors le buffer depuis l'intérieur de String.

+0

Merci beaucoup pour votre réponse! Je me sentais un peu bête de ne pas y penser moi-même, mais il y avait un petit problème d'impression trop de parenthèses, ce qui était facile à régler. – Guy

+0

il n'y a pas trop de parenthèses. Seules les parenthèses inutiles;). –