2012-04-22 13 views
0

以下のコードでは、を削除して、の操作を実装しようとしました。しかし、複雑な削除部分を開始する前に、リーフノードを削除できませんでした。変数がどこに定義されているのかは関係ありますが、解決することはできません。任意のアイデアをいただければ幸いです。バイナリ検索ツリーからノードを削除する

ノードを削除したい部分は、基本的にdelete temp;部分として実装されています(ちなみに、私はdelete[]temp;として挿入してもまだ動作しません)。

void remove(int value){ 
     if(root==NULL) 
      cout<<"The list is empty!"<<endl; 
     else { 
      Node *temp=root; 
      while(temp!=NULL) 
      { 
       cout<<"Processing: "<<temp->data<<endl; 
       if(value==temp->data) 
       { 
        cout<<"Data verified"<<endl; 
        //DELETE ROOT 
        if(temp->left && temp->right) //If it has two children 
        { 
         cout<<"Root with two children"<<endl; 
         return; 
        } 
        if(temp->left || temp->right) 
        { 
         cout<<"Root with a single child"<<endl; 
         return; 
        } 
        else { 
         cout<<"Leaf node"<<endl; 
         delete temp; 
         return; 
        } 
       } 
       else if(value<temp->data){ 
        if(temp->left) 
         temp=temp->left; 
        else 
         return; 
       } 
       else{ 
        if(temp->right) 
         temp=temp->right; 
        else 
         return; 
       } 


      } 
     } 
    } 

答えて

3

The delete operatorは、あなたがそう考えるとはしません。それは、オブジェクトが未使用として使用したメモリをマークします。つまり、オブジェクトを再び使用することができます(オブジェクトのデストラクタも呼び出しますが、ここでは関係ありません)。

これは、ではありませんは、削除されたオブジェクトを指すポインタを変更しているので、自分でそれを行う必要があります。

したがって、そのブランチの正しいコードは、削除されたノードの親にアクセスし、leftまたはrightフィールド(削除されたノードに応じて)をNULLに設定する必要があります。それだけで、実際にノードdeleteを実行できます。