2016-11-25 4 views
-2

Ich bin ein Anfänger. Ich versuche, einen Avl-Baum Level für Level zu drucken und es sollte von rechts nach links sein. aber das Ergebnis von links nach rechts. Ich hoffe du kannst mein Problem lösen. Hier ist das Stück von meinem Quellcode:Drucken AVL-Tree Level für Level (C++)

void printOrder(TreeNode *treePtr, int *row) { 
    if(treePtr != NULL){ 
     (*row)++; 
     printOrder(treePtr->rightPtr,row); 
     int i; 
     for(i=0;i<(*row);i--) 
      printf("\t"); 
     printf("%d\n", treePtr->data); 
     printOrder(treePtr->leftPtr,row); 
     (*row)--; 
    } 
} 

void printTree(TreeNode *treePtr) { 
    int row = 0; 
    printOrder(treePtr,&row); 
} 

Das Ergebnis:

  80 
    70 
50 
    40 
      30 

Das Ergebnis, das ich sollte so sein wollen:

 30\ 
      40\ 
       50 
      70/ 
     80/ 

Antwort

0

Sie könnten zunächst Ihren Baum durchqueren (wie Sie es bereits tun) und fügen Sie jeden Eintrag zu einem std::vector statt direkt zu drucken, was zu einer Folge von Elementen wie

führt
{80,70,50,40,30} 

und dann umkehren Ihr den Inhalt des Vektors führt

{30,40,50,70,80} 

Drucken Sie nun, dass der Inhalt in dieser Form Sie wünschen, indem Sie gerade über den Vektor Looping.

Um die richtige Absicht zu erhalten, können Sie std::pair Elemente in dem Vektor speichern, die die Absichtsebene als zweites Element enthalten, z.

{{80,0},{70,1},{50,2},{40,1},{30,0}} 

Für den Druck intendation subtrahieren Sie die Nummer aus der maximalen Höhe der intendation.

Oder alternativ Traverse Ihr Baum in der linken Mitte-Rechts-Ordnung durch die Linien Austausch

printOrder(treePtr->rightPtr,row); 

und

printOrder(treePtr->leftPtr,row); 

und drucken Sie es wie gewünscht.

+0

wie, wenn ich es direkt drucken möchte? –

+0

@Michael Loew Wie ich in meinem letzten Satz vorgeschlagen habe: Durchsuche den Baum in der Reihenfolge von links nach rechts, indem du die folgenden Zeilen austauschst: '' printOrder (treePtr-> rightPtr, row); ''und'' printOrder (treePtr-> leftPtr , Reihe); – cwschmidt