2017-12-31 111 views
-1

Hallo Ich habe versucht, mit Rücksicht zu Knoten in einen binären Suchbaum einzufügen. Aber ich denke jetzt bin ich jetzt in der Einfügefunktion fest. Ich glaube, ich habe einen Fehler gemacht, als ich mich an die Einfügefunktion erinnere. Also kann mir jeder helfen, mir zu sagen, was mit meinem Code nicht stimmt, danke.C++ binärer Suchbaum durch Verwendung der Dereferenz

struct BstNode { 
    int data; 
    BstNode *left; 
    BstNode *right; 
}; 


BstNode *GetNewNode(int); 

void Insert(BstNode **, int); 

void Insert(BstNode **root, int data) 
{ 
    if(*root == NULL){ 
     *root = GetNewNode(data); 
    } 
    else if(data <= root){ 
     Insert(*(root -> left), data); 
    } 
    else { 
     Insert(*(root -> right), data); 
} 

BstNode *GetNewNode(int data) 
{ 
    BstNode *newNode = new BstNode(); 
    newNode->data = data; 
    newNode->left = newNode->right = NULL; 
    return newNode; 
} 

int main() 
{ 
    BstNode *root = NULL; 

    Insert(&root,15); 
    Insert(&root,10); 
    Insert(&root,20); 

    return 0; 
} 
+0

Können Sie näher erläutern, was Sie meinen "stecken"? Compilerfehler? Programm läuft, hört aber nie auf? Kann ich nicht herausfinden, wie man den Code schreibt? – 1201ProgramAlarm

+0

@Shawn W W Diese Bedingung else if (Daten <= root) {ergibt keinen Sinn. –

Antwort

0

Was Sie meinen, ist die folgende

void Insert(BstNode **root, int data) 
{ 
    if (not *root) 
    { 
     *root = GetNewNode(data); 
    } 
    else if (data < (*root)->data) 
    { 
     Insert(&(*root)->left, data); 
    } 
    else 
    { 
     Insert(&(*root)->right, data); 
    } 
} 

die Syntax der Bedingungen in dieser Funktion mit der Syntax von Bedingungen in Ihrer Funktion Implementierung vergleichen und alles wird klar sein.

Zum Beispiel dieser if-Anweisung mindestens zwei Fehler

else if(data <= root){ 
     ^^^^^^^^^^^^ 
     Insert(*(root -> left), data); 
       ^^^^^^^^^^^^^^^ 

und der Compiler entsprechende Diagnosemeldungen ausgeben.

+0

Vielen Dank, es funktioniert. Aber ich frage mich, was ist die Bedeutung von & (* root) -> hier drin. Nimm die Adresse des Zeigers? Ich bin verwirrt. Und warum hier zwei * vor der Wurzel in der Einfügen-Funktion. Danke nochmal für deine Hilfe. –

+0

@ShawnWW Um einen Zeiger auf einen ursprünglichen Knoten zu ändern, müssen Sie ihn als Verweis übergeben, indem Sie einen Zeiger auf den Zeiger verwenden. Andernfalls wird die Funktion mit einer Kopie des ursprünglichen Knotens abgewickelt. –

+0

Danke, kannst du erklären, was die Bedeutung von & (* root) -> left ist? –

-1

Es gibt einige Fehler in Ihrem Code Fehler angezeigt Sie wissen BST nicht so gut

Zuerst Sie einen Knoten in der Insert-Funktion Zweitens erklären müssen Sie müssen prüfen, ob es kleiner oder größer als die Daten von die Wurzel Wenn es gleich den Daten im Stamm ist, können Sie es einfügen Drittens, wenn Sie den Knoten einfügen, sollten Sie den rechten oder linken Zeiger des Stammes durch den Knoten verbinden, den Sie erstellt haben