2016-04-09 21 views
1

私は削除のためのbst関数を作成しようとしていました。しかし、これは何時間も苦労していますが、セグメント化エラーの原因を突き止めることはできませんでした。誰かが私を見つけて助けてくれますか?ここに私のコードです。C++バイナリ検索ツリーでセグメント化エラーが削除されます

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

にすべてrootの参照を変更するこんにちは、はい、それはです。私は編集しました。ありがとう! –

答えて

2

あなたremoveHelper機能は、そのrootパラメータに新しい値を代入されますが、関数が返したときに、これらの新しい値が失われます。 removeHelper関数の呼び出しに使用した変数の値を変更したい場合は、参照渡しする必要があります。

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

ノードポインタ値の変更は、呼び出し元の関数に反映されます。

も、それはそれは非常に混乱読みになり、クラスのメンバ変数rootを、隠しているようrootは、あなたのパラメータのための本当に悪い名前であることに注意します。 nodeに変更することをお勧めします。例えば:

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

そしてもちろん、node

+0

ありがとう!あなたは多くの手伝いをした –

関連する問題