Binary Trees - durch Code Tracing

stimmen
0

Angesichts dem Binärbaum unten gezeigt, bestimmt die Reihenfolge , in der die Knoten des binären Baums unten unter der Annahme der Funktion eines besuchtes (root) aufgerufen. Es sei angenommen , dass der Baumknoten und Zeiger definiert werden , wie dargestellt. Es sei angenommen , dass ein Root - Zeiger auf den Knoten enthält , ist 60. Meine Antwort auf dieses Problem ist unten angegeben. Ist es richtig? Was habe ich falsch gemacht?

                                   60
                                 /    \
                                30     90
                               /  \   / 
                              5   38  77
                               \  /  / \
                               8 32 62  88



struct treeNode{
  int data;
  struct treeNode *left, *right:
  {

struct treeNode *tree_ptr;

void A(struct treeNode *node_ptr){
    if (node_ptr != NULL){
    printf(“%d ,”,node_ptr->data);
    B(node_ptr->left);
    B(node_ptr->right);
   }   
}

void B(struct treeNode *node_ptr){
    if (node_ptr != NULL) {
    A(node_ptr->left);
    printf(“%d ,”,node_ptr->data);
    A(node_ptr->right);
   }
 }   

Antwort: In Leeren A sagt , es bis zum ersten Druck node_ptr-> Daten so 60 dann gedruckt wird die Funktion aufruft B (node_ptr-> links) , dann innerhalb von B, A (node_ptr-> links) aufgerufen werden Sie dann drucken , dass Daten , die 5 . Und dann A (node_ptr-> rechts) gehen zurück bis zu A aufgerufen wird, zu drucken , die Daten so werden 8 gedruckt. Im jetzt nicht mehr so sicher , was als nächstes zu tun , aber ich logisch wäre es sinnvoll , 30 zu drucken , machen aber ich bin nicht sicher , wie die ptr von 8 bis 30 bekommt Und dann , wenn Sie in dem gleichen Muster weiter 38 wird gedruckt und 32 wird gedruckt. Für den rechten Unterbaum ... 90 77 62 88

Veröffentlicht am 14/12/2010 um 22:05
quelle vom benutzer
In anderen Sprachen...                            


4 antworten

stimmen
1

Für den Anfang hat Ihr Code ein paar Fehler drin. Ich vermute, es sollte so mehr sein:

struct treeNode{
  int data;
  struct treeNode *left, *right;
}

treeNode *tree_ptr;

void A(treeNode *node_ptr){
    if (node_ptr != NULL){  /// this could be just if(node_ptr)
        printf(“%d ,”,node_ptr->data);
        B(node_ptr->left);
        B(node_ptr->right);
    }   
}

void B(treeNode *node_ptr){
    if (node_ptr != NULL) {
        A(node_ptr->left);
        printf(“%d ,”,node_ptr->data);
        A(node_ptr->right);
    }
}   

Sie mischen auch zwei verschiedene Traversal - Algorithmen. A()ist vorbestellbarer, B()ist in Ordnung. A()und B()soll sich seinen Aufruf, nicht sie. (Noch ein weiterer Grund für die Verwendung reelle Variable / Funktionsnamen statt A, Bund so perfekt .)

Beantwortet am 14/12/2010 um 22:11
quelle vom benutzer

stimmen
1

schreiben Sie einfach den vollständigen Ausführungsstapel über die Zeit. So was:

A(60)
  printf
  B(30)
    A(5)
      ...
    printf
    A(38)
      ...
  B(90)
    ...

(Der Rest des Baumes als Übung für den Leser.)

Dann gehen Sie einfach von oben nach unten, schreibt die Ergebnisse der printf Aussagen nach unten.

Beantwortet am 14/12/2010 um 22:14
quelle vom benutzer

stimmen
1

Aist eine vorbestellbarer Traversal, während Bein In-Order - Traversal ist.

Eine einfache Möglichkeit für Sie die Reihenfolge des Drucks , um herauszufinden , ist zu sehen , wie Sie die Knoten selbst besuchen. Ich ziehe in der Regel ein Umriss um die Außenseite des Baumes (beginnend an der Wurzel und Bewegung durch links oder rechts auf der Grundlage des Unterbaums Sie durchqueren zuerst). Wenn ich eine Pre-Order Traversal tue, drucke ich einen Knoten aus , wenn ich entlang bewegen seiner Außenseite . Wenn ich eine In-Order - Traversal tue, drucke ich nur einen Knoten aus , wenn ich mich bewege unter es (das macht Sinn , wenn man sich in Ordnung Traversierungen aussehen, weil man die Blätter der ersten Druck am Ende, sie sind die ersten Knoten , die Sie bewegen unter , wenn Sie die Umrisse zeichnen). Wenn ich eine Post-Order Traversal tue, drucke ich nur einen Knoten aus , wenn ich entlang seiner Bewegung nach innen .

AKTUALISIEREN

Der Grund 30 wird nach 5 ausgedruckt und 8 ist, dass Sie nicht ein rein vorbestellen Traversal durchführen. Sie springen zwischen einer Pre-Order und einem In-Order Traversal.

Eine einfache Möglichkeit ist die Reihenfolge, um herauszufinden, die Schritte, um tatsächlich schreiben Sie Ihren Code durchläuft, wie Sie durch sie verfolgen (I häufig Stift / Bleistift und Papier verwenden, um die Informationen zusammen zu halten). Zum Beispiel könnten Sie tun, einen Call-Stack wie folgt schreiben:

A(60)
  printf(60)
  call B(60.left)
    B(30)
      call A(30.left)
        A(5)
          printf(5)
          call B(5.left)
            B(null)
          call B(5.right)
            B(8)
              call A(8.left)
                A(null)
              printf(8)
              call A(8.right)
                A(null)
      printf(30)
      call A(30.right)
        A(38)
        ...

Sie können ganz einfach, in welcher Reihenfolge sehen die Knoten gedruckt werden, und was noch wichtiger ist, warum Sie „springen“ von Druck 8 bis 30 Druck (eine rekursive Aufruf beendet ist und du fällst eine Ebene zurück).

Beantwortet am 14/12/2010 um 22:15
quelle vom benutzer

stimmen
1

60, 30, 5, 8 35 32 etc In - - 5, 8, 30, 32, 35 usw. die Spur wie oben angegeben kann entweder für Pre-Reihenfolge oder Ordnung Pre nicht korrekt

Beantwortet am 28/03/2011 um 09:59
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more