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;
                }


            }
        }
    }
4

1 に答える 1

3

deleteオペレーターは、あなたが思っていることをしません。これは、オブジェクトによって使用されたメモリを未使用としてマークすることです。これは、再度使用できることを意味します (オブジェクトのデストラクタも呼び出しますが、ここでは関係ありません)。

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

したがって、そのブランチの正しいコードは、削除されたノードの親にアクセスし、そのleftorrightフィールド (削除されたノードに応じて) を に設定する必要がありますNULLdeleteそうして初めて、実際にノードを作成できます。

于 2012-04-22T14:11:44.860 に答える