2017-05-12 5 views
2

Ich habe den folgenden Algorithmus mit Rekursion versucht, aber die Knoten werden nicht an den Baum angehängt. Bitte sag mir, was los ist.Wie füge ich einen Knoten in BST hinzu?

void search_add(struct node *t) 
{ 
    if(t==NULL) 
    { 
     t = newNode(temp->key); 
     return; 
    } 
    else if(t->key>temp->key) 
    { 
     search_add(t->right); 
    } 
    else if (t->key<temp->key) 
    { 
     search_add(t->left); 
    } 
} 

void insert(struct node *node, int key) 
{ 
    temp = newNode(key); 
    search_add(node); 
} 

int main(void) 
{ 
    root = newNode(50); 
    insert(root,30); 

    return 0; 
} 
+2

't = newNode (temp-> -Taste);' ändert sich nur die lokale Kopie übergeben, die dann vergessen wird und der Anrufer 't-> right' oder' t-> left' bleibt NULL '. –

+1

Es gibt * Tausende * von Duplikaten dieses Problems auf dieser Website. Leider wird der Fehler im Allgemeinen von Anfängern gemacht und die Titel/Texte der Fragen sind so unterschiedlich, dass sie schwer zu finden sind. 't = newNode (temp-> key);' * * * * * * * * * * * * * * * * * * * * * nicht * * * Es ist eine lokale Variable, soweit es die Funktion betrifft. All dies führt letztlich dazu, dass Speicher verloren geht. [Beispiel duplizieren hier] (https://stackoverflow.com/questions/13188313/why-is-my-bst-root-pointer-changing-for-some-unknown-reason). – WhozCraig

+0

Willkommen bei StackOverflow. Bitte nehmen Sie die [Tour], lernen, gute Fragen zu stellen stackoverflow.com/help/how-to-ask, machen eine [MCVE]. Wenn Sie Hilfe mit Debugging-Code suchen, siehe https://ericlippert.com/2014/03/05/how-to-debug-small-programs/ – Yunnosch

Antwort

0

Das Problem ist, wie bereits byWeather Vave erwähnt, ist:

t = newNode(temp->key); nur geleitet, um die lokale Kopie zu ändern, die dann vergessen wird und der Anrufer t->right oder t->left bleibt NULL.

könnte eine Lösung sein, dies zu ändern:

void search_add(struct node *t) 

dazu:

void search_add(struct node *t) 

Natürlich dann *t im Inneren des Körpers der Funktion verwenden, statt t.

Auf diese Weise übergeben Sie einen Doppelzeiger, der Änderungen außerhalb des Bereichs der Funktion sichtbar macht.

0

Sie vergeben keinen Wert in Ihrer Rekursion. Bitte versuchen Sie unten Code Ich bin ein Java, also ignorieren Sie bitte jedes Syntaxproblem.

/* If the tree is empty, return a new node */ 
    if (node == NULL) return newNode(key); 

    /* Otherwise, recur down the tree */ 
    if (key < node->key) 
     node->left = insert(node->left, key); 
    else if (key > node->key) 
     node->right = insert(node->right, key); 

    /* return the (unchanged) node pointer */ 
    return node; 
Verwandte Themen