2016-04-09 21 views
1

Ich habe versucht, eine BST-Funktion zum Entfernen erstellen. Allerdings habe ich mit diesem Problem für viele Stunden, aber ich konnte nicht herausfinden, was Ursachen für Segmentierung Fehler. Kann mir jemand helfen, es herauszufinden? Hier ist mein Code;C++ Binäre Suche Baum entfernen Segmentierung Fehler

bool Set::remove(const ItemType & item) { 
    return removeHelper(root, item);  
} 


bool Set::removeHelper(Node *root, const ItemType &item) {  
    if (root == NULL) {//check if root is null 
     return false; 
    } 
    else if (item == root->data) {//check if item equals to root 
     Node *temp = root; 
     if (root->right == NULL && root->left == NULL) {//check if roots equal to null 
      root = NULL; 
     } 
     else if (root->right == NULL) {//check if root equals to null 
      root = root->left; 
     } 

     else if (root->left == NULL) {//check if root equals to null 
      root = root->right; 
     }  
     else { 
      Node *p = root; //it is like parent root 
      temp = temp->right;  
      while (temp->left != NULL) {//check if temp root equals to null 
       p = temp; 
       temp = p->left; 
      }  
      if (p == root) {//check if root equals to parent 
       p->right = temp->right; 
      } 
      else { 
       p->left = temp->right; 
      } 
      root->data = temp->data; 
     } 
     delete temp;//delete temp node 
     return true; 
    }  
    else if (item < root->data) 
     removeHelper(root->left, item);//call recursive delete function  
    else if (item > root->data) 
     removeHelper(root->right, item);//call recursive delete function  
    return false; 
+0

Ändern Hallo, ja es ist. Ich habe bearbeitet. Vielen Dank! –

Antwort

2

Ihre removeHelper Funktion neue Werte zu seiner root Parameter zuweisen, aber diese neuen Werte werden, wenn die Funktion zurückkehrt verloren. Wenn Sie den Wert der Variablen ändern möchten, die zum Aufrufen der removeHelper-Funktion verwendet wird, sollten Sie sie als Referenz übergeben.

dann werden die Änderungen am Knotenzeigerwert in der aufrufenden Funktion widergespiegelt.

Beachten Sie auch root ist ein wirklich schlechten Namen für die Parameter, da sie die Klassenvariable root versteckt, die es sehr verwirrend macht zu lesen. Ich würde vorschlagen, es zu etwas zu node zu ändern. z.B .:

bool Set::removeHelper(Node * &node, const ItemType &item) { 

und natürlich alle root Verweise auf node

+0

Vielen Dank! Du hast viel geholfen –