2017-02-14 7 views
0

Ich habe eine harte Zeit zu visualisieren, wie wird mein Programm die Elemente einfügen. Hier ist der Code, der Lehrer uns gegeben hat:Reihenfolge der Elemente in perfekt ausgeglichenem Baum

int arr[] = { 3, -2, 11, 7, 12, 1, 4, 5, 33, 13 }; 
int n = 10; 
int cnt = 0; 

typedef struct node*po; 

struct node { 
    int data; 
    po left; 
    po right; 
}; 

po ibd(int n) { 
    po holder; 
    if (n>0) { 
     int nl = n/2; 
     int nr = n - nl - 1; 
     holder = new node; 
     holder->data = arr[cnt++]; 
     holder->left = ibd(nl); 
     holder->right = ibd(nr); 
     return holder; 
    } 
    else { 
     return NULL; 
    } 
} 

Ich kann leider nicht verstehen und visualisieren, wie es die Elemente in dem Baum legt. Von dem, was ich verstehen kann, verwendet es rekursiv Divide-and-Conquer-Algorithmus, um das Array in zwei Teile aufzuteilen und die Elemente hinzuzufügen, aber ich kann nicht verstehen, welches Element zum Stamm wird. Kann mir jemand helfen zu visualisieren, wie der Baum aussehen würde, nachdem alles eingefügt wurde?

+1

Sie sollten mit Ihrem Debugger durch den Code gehen und sehen, was es tut. – NathanOliver

+1

Sie sollten das C-Tag für diese Frage lieber als das C++ - Tag verwenden. –

+1

Wenn die Funktionssignatur des Lehrers "po ibd (int n)" ist, fürchten Sie die Zukunft der Code-Klarheit – Drax

Antwort

0

Wenn mit Bäumen, Ich mag einen Knoten, so etwas zeichnen:

+--------------+---------------+ 
|   Data    | 
+--------------+---------------+ 
| Pointer to | Pointer to | 
| left subtree | right subtree | 
+--------------+---------------+ 

Wenn ich einen Knotenpunkt zu einem anderen zu machen, verwende ich die Pfeile aus den entsprechenden left oder right Zeigern auf den neuen Knoten. Dies hilft mir, den Baum zu visualisieren.

Es gibt viele Ressourcen, die zeigen, wie Bäume gezeichnet werden.

Sobald der Baum gezeichnet ist, folgen Sie den Pfeilen, wenn Sie einen neuen Knoten hinzufügen.

+0

Ja, ich kann das verstehen und Bäume zeichnen, aber ich habe Probleme mit genau diesem Beispiel. Sagen wir, ich habe das Array: {3, -2, 11, 7, 12, 1, 4, 5, 33, 13}. Was die Funktion macht, ist das Aufteilen des Arrays in 2: n/2 und n - n/2 - 1. Nun habe ich zwei Arrays: {3, -2, 11, 7, 12, 1} und {4, 5, 33, 13}. Ich kann jedoch nicht verstehen, welches Element meine Wurzel wird. Ist es 1 (5h Array-Element, seit n/2 = 5), und dann setzen Sie die anderen links und rechts, oder bekomme ich etwas falsch? Ich würde wirklich verstehen, wie es funktioniert, wenn mich jemand gerade dieses aktuelle Beispiel gezeichnet hat. –

+0

Gemäß dieser Aussage: 'holder-> data = arr [cnt ++];', sind Ihre Stammdaten 3, weil 'cnt' null ist und' arr [0] == 3'. –

+0

Ich schlage vor, die Funktion zu verwerfen und Ihren eigenen Binary Tree Builder zu schreiben, den Sie ** verstehen **. –

Verwandte Themen