2016-04-21 13 views
-2
void insert(int key) 
{ 
    insertRec(key, root); 
} 

void insertRec(int key, Node *current) 
{ 
    if(current==NULL) 
     current = new Node(key); 
    else if(key <= current->value) 
     insertRec(key, current->leftChild); 
    else 
     insertRec(key, current->rightChild); 
} 

Wie kommt das nicht funktioniert?Binary Tree rekursive Einfügemethode funktioniert nicht

In der Insert-Funktion werden der Schlüsselwert und das Stammverzeichnis der Struktur an insertRec übergeben. Wenn der Knoten null ist, erstellen Sie einen neuen Knoten und legen Sie ihn auf den Schlüsselwert fest. Andernfalls entweder rekursiv nach links oder rechts gehen, bis der Knoten einen Nullpunkt erreicht und dort einen neuen Knoten einfügen.

+1

[Finden Sie einen guten Anfänger Buch] (http://stackoverflow.com/questions/ 388242/the-definitive-c-book-guide-and-list) und lesen Sie über Passing-Argumente * durch Verweis *. –

+3

Das Zuweisen einer lokalen Variable "current" ist nicht dasselbe wie das Einfügen des Knotens. Es ändert nur die lokale Variable, nicht * worauf sich die Variable bezieht *, was Sie wollen. Für zukünftige Referenz, versuchen Sie zu vermeiden, nur Dinge zu sagen "funktioniert nicht". Beschreibe * wie * dein Code nicht funktioniert. – Zong

+0

'void insertRec (int key, Node * & current)' sollte den Trick machen. –

Antwort

2

Es stimmt nicht, dass der Code nicht funktioniert. Natürlich funktioniert es, so wie es geschrieben steht. Das Problem ist, dass du etwas anderes geschrieben hast als das, was du brauchst.

, wenn Sie ein Argument insertRec() passieren, wird die Routine eine Kopie einen Zeiger auf das Node Objekt. Also, wenn Sie einen Wert in

current = new Node(key); 

zuordnen überschreiben Sie eine lokale Kopie in der lokalen Variablen current. Die aufrufende Funktion (und ihre Daten) wissen nichts darüber.

Wenn Sie den Anrufer wollen den neuen Wert zu empfangen, erklären eine Funktion a reference auf eine Variable nimmt:

void insertRec(int key, Node *&current) 
+0

Danke. Hinzufügen eines & machte den Code wie vorgesehen. Aber ich bin verwirrt über * und &. Ich dachte, dass beide auf die gleiche Adresse zeigen, in diesem Fall ist es die Adresse des Wurzelknotens, und ich kann den Wert durch den Zeigerstrom ändern. – Raymond

+0

Das ist nicht seltsam, nur ein Verweis auf einen Zeiger. Eine solche Referenz ist nur ein Zeiger unter einer Maske. Sie können es zu einem expliziten Zeiger auf einen Zeiger machen, indem Sie 'void insertRec (int key, Node ** current)' deklarieren und es mit 'insertRec (key, & (current-> leftChild));' aufrufen (innere Klammern sind nicht notwendig, nur zur besseren Lesbarkeit hinzugefügt). Dann sollte die Hauptzuweisung wie folgt aussehen: * current = new Node (key); mit einer expliziten Dereferenzierung. – CiaPan