2009-12-08 13 views
1

Je travaille sur un arbre de recherche binaire. J'ai un problème pour aligner les nœuds en sortie. J'imprime l'ordre de tableau, pré-commande, inorder, postorder ... Le format de commande de tableau est aligné gauche comme je veux qu'il soit .. Im en utilisant fondamentalement le même code (setw et gauche, dans le même ordre) en ordre de tableau comme je suis avec l'ordre de pré-commande, et le reste .. Cependant, il ne sera pas aligné ..Problème de formatage de la sortie C++

J'ai tout essayé .. des trucs?

sortie correcte ..

Database Of Great Computer Scientists 

>>> array order: 

name      leaf? index 
----      ----- ----- 
Ralston, Anthony      0 
Liang, Li        1 
Von Neumann, John      2 
Jones, Doug       3 
Trigoboff, Michael     5 
Goble, Colin    leaf  7 
Knuth, Donald       8 
Turing, Alan    leaf  12 
Kay, Alan     leaf  17 
(items printed)       (9) 

>>> preorder: 


name      leaf? index 
----      ----- ----- 
Ralston, Anthony      0 
Liang, Li        1 
Jones, Doug       3 
Goble, Colin    leaf  7 
Knuth, Donald       8 
Kay, Alan     leaf  17 
Von Neumann, John      2 
Trigoboff, Michael     5 
Turing, Alan    leaf  12 
(items printed)       (9) 

>>> inorder: 


name      leaf? index 
----      ----- ----- 
Goble, Colin    leaf  7 
Jones, Doug       3 
Kay, Alan     leaf  17 
Knuth, Donald       8 
Liang, Li        1 
Ralston, Anthony      0 
Trigoboff, Michael     5 
Turing, Alan    leaf  12 
Von Neumann, John      2 
(items printed)       (9) 

>>> postorder: 


name      leaf? index 
----      ----- ----- 
Goble, Colin    leaf  7 
Kay, Alan     leaf  17 
Knuth, Donald       8 
Jones, Doug       3 
Liang, Li        1 
Turing, Alan    leaf  12 
Trigoboff, Michael     5 
Von Neumann, John      2 
Ralston, Anthony      0 
(items printed)       (9) 

>>> retrieve Trigoboff, Michael 

Trigoboff, Michael 

>>> retrieve Kaye, Danny 

not found 

est ici le code pour afinde. Le reste des fonctions sont presque identiques dans la façon dont la mise en place à la sortie ..

void BST::displayInOrder(ostream& out, int parent)const 
{ 
if (parent <= maxsize) 
{ 

this->displayInOrder(out, 2 * parent + 1); 

if (!items[parent].empty) 
{ 
out << left 
<< setw(27) << items[parent].instanceData; 
out << right 
<< setw(10); 
if(!items[parent].isLeaf) 
{ 
out << left 
<< setw(11) << "leaf"; 

} 
out << setw(12) << parent; 
out << endl; 
} 

this->displayInOrder(out, 2 * parent + 2); 

} 

if(!parent) 
{ 
itemsPrinted(out,size); 
} 

} 

et est le code de l'ordre du tableau ici qui a laissé aligne ..

void BST::displayArrayOrder (ostream& out) const 
{ 

out << ">>> array order:" << endl; 
displayHeaders(out); 


for(int index=0; index < maxsize+1; index++) 
{ 

if (!items[index].empty) 
{ 
out << left 
<< setw(27) << items[index].instanceData; 
out << right 
<< setw(10); 

if(index > size) 
{ 
items[index].isLeaf = false; 
out << left 

<< setw(10) << "leaf"; 
} 
if(items[2*index+1].empty && items[2*index+2].empty && index < size) 
{ 
    items[index].isLeaf = false; 
    out << left 

<< setw(11) << "leaf"; 
} 

out << setw(12) << index; 
out << endl; 


} 


} 
if(!parent) 
{ 
itemsPrinted(out,size); 
} 


    } 
+0

Est-ce que ce travail est fait? –

Répondre

3

vous une faveur: écrire une fonction pour afficher un enregistrement, et l'utiliser partout où vous avez besoin d'afficher ce type d'enregistrement. Puisque vous avez déjà du code qui fonctionne en un seul endroit, utilisez simplement ce code dans le corps de votre print_record() (ou quoi que vous décidiez de l'appeler).

Une chose que vous devriez apprendre presque aussi vite que possible: dupliquer le même code de base trois ou quatre fois plus est vraiment mauvaise chose, et vous devriez l'éviter.

+0

L'ordre dans lequel setw et left sont maintenus dans la fonction est le même. Chaque fonction affiche inorder, ou postorder et ce code est différent. Dans cette situation, je dois vérifier différentes choses et il serait donc trop difficile d'obtenir une autre fonction d'affichage pour fonctionner avec la fonction d'affichage. – Steller

+3

L'ordre dans lequel vous visitez les nœuds ne devrait faire aucune différence dans la façon dont vous affichez les données d'un nœud individuel. –

1

Comme je vois votre code, le displayArrayOrder n'affiche pas simplement l'ordre mais définit également la propriété isLeaf, cette propriété est alors utilisée directement dans les autres fonctions d'affichage. Comme l'a noté Jerry Coffin, divisez ces éléments et utilisez la même fonction d'enregistrement d'impression dans toutes vos fonctions d'affichage.

Quelque chose comme ça devrait vous aider à démarrer. (Apparemment, vous imprimer leaf quand isLeaf est faux, je gardais cette convention)

bool BST::hasToPrintLeaf(int index) { 
    if (!items[index].isLeaf) { 
    return true 
    } 
    if (index > size || 
     (index < size && items[2*index+1].empty && items[2*index+2].empty)) { 
    items[index].isLeaf = false; 
    return true; 
    } 
} 

void BST::printRecord(std::ostream & out, int index) { 
    out << left << setw(27) << items[index].instanceData; 
    out << right << setw(10); 

    if(hasToPrintLeaf(index)) { 
    out << left << setw(11) << "leaf"; 
    } 

    out << setw(12) << index << endl; 
} 

Notez que je ne change pas vraiment quoi que ce soit à l'égard de votre logique, alors que j'ai des doutes sur certaines choses ... (vos tests à deux feuilles excluent l'indice == taille comme un cas par exemple)

+0

Cela fonctionne bien. Je l'ai utilisé pour l'ordre de poste, inorder, précommande .. Cependant, quand j'imprime "feuille" je ne peux pas obtenir le 7 pour aligner comme les autres nombres de feuille de noeud font. Probablement parce que c'est un seul chiffre et les autres ne le sont pas. – Steller