1

そのため、私の古い C++ バイナリ検索ツリー プログラムを動作させようとしています。コンパイルして実行しますが、期待する結果が得られません。c、d、a、b をその順序で挿入し、c を削除しようとすると、削除関数は、後続の順序で見つかった if 条件をスキップします。条件がスキップされた場合、なぜこれら2つは他にあるのですか?

また、gcc を使用してコンパイルされます。

  Node::Node(string nodeItem,
           int nodeLine){
    item=nodeItem;
    vector<int> tempVector;
    tempVector.push_back(nodeLine);
    lines=tempVector;
    leftPtr = NULL;
    rightPtr = NULL;
}


// recursive method for finding node containing the word
Node* BST::find(string data, Node *curr) {

    if(curr==NULL) {
        cout << data << " is not in the tree" << endl;
        return curr;

    }
    if(curr->getItem().compare("theplaceholder")==0){
        return curr;
    }
    string tempItem = curr->getItem();
    //this if statement is if I am inserting a word that is already in the tree
    // or if I am removing the word from the tree
    if(data.compare(tempItem)==0){
        return curr;
    }
    else if(data.compare(tempItem)<0){
        return find(data,curr->getLeftPtr());
    }
    else{
        return find(data, curr->getRightPtr());
    }

}


void BST::insert(string data, int fromLine) {
    Node *curr;


    curr=find(data, root); 


    if(curr!=NULL && curr->getItem().compare("theplaceholder")==0){

        curr->setData(data);

        curr->addLines(fromLine);
    }


    if(curr==NULL){

        // I want to point to a nonNull node.
        // I am making a new node and having curr point to that instead of NULL
        //then I set it to



        curr=new Node(data, fromLine);


        cout <<curr->getItem() << endl;

        vector<int> foundLines=curr->getNodeLines();
        //cout<< "The word " <<curr->getItem() << " can be found in lines ";
        if(foundLines.empty())
            cout << "foundLines is empty";
        int size=foundLines.size();
        for(int count=0; count<size; count++){

            //cout << foundLines[count] << ", ";
        }

    }

    if(curr->getItem()==data){
        curr->addLines(fromLine);
    }
}
// remove method I am trying to check for in order successors to swap with the deleted node.
void BST::remove(string data) {
    Node *curr=root;


    Node *temp=find(data, curr);
    if(temp==NULL){
        cout << " nothing to remove" << endl;
    }
    else if(temp->getRightPtr()!=NULL){

        curr=temp->getRightPtr();
        cout << curr->getItem() << endl;
        while(curr->getLeftPtr()!=NULL){
            curr=curr->getLeftPtr();
            cout << curr->getItem() << endl;
        }
        temp->setData(curr->getItem());

        temp->setLines(curr->getNodeLines());
        delete curr;
        curr=NULL;
    }
    else if(temp->getLeftPtr()!=NULL){
        cout <<"if !temp->getLeftPtr" << endl;
        curr=temp->getLeftPtr();
        cout << curr->getItem() << endl;
        while(curr->getRightPtr()!=NULL){
            curr=curr->getRightPtr();
            cout << curr->getItem() << endl;
        }
        temp->setData(curr->getItem());

        temp->setLines(curr->getNodeLines());
        delete curr;
        curr=NULL;
    }
    else{
        cout <<"else delete temp" << endl;
        delete temp;
        temp=NULL;

    }

}
4

1 に答える 1

0

この行の理由

else if(temp->getRightPtr()!=NULL){

決して成功しないということは、どのノードにも正しいポインターを設定しないということです。getRightPtr は null しか返せません。ツリーをビルドした後にデバッガーでツリーの状態を調べた場合、または挿入関数をステップ実行した場合は、おそらくこれを見たことがあるでしょう。問題は次のとおりです。

  • ノードがツリーにない場合、find 関数は null を返しませんが、insert 関数はそれを期待しています
  • 挿入関数は、このノードがあるべきツリー内の位置を見つける必要があります-検索関数を修正するか、それ自体で、新しいノードを作成し、左または右の親ノードからそのノードへの参照を追加します適宜サイド
  • 挿入関数は、最初に挿入されたノードの行番号を 2 回表示します。1 回はプレースホルダーを上書きするとき、もう 1 回は挿入の最後です (ここでプレースホルダーを使用するのではなく、おそらくrootnull に初期化して、代わりに root = curr を設定します)。最初のノードを作成するとき)
  • 左側のブランチから最上位のノードを昇格させる場合、削除関数はさらに多くの作業を行う必要があります。する必要がある
    • そのノードを以前の親から正しくクリーンアップします - 現時点ではオブジェクトを削除しますが、ぶら下がっているポインタはそのままにしておきます
    • そのノードを移動して前のスロットに移動する前に、そのノードの子を昇格させます

すなわち

      D                                       C                           
     / \                                     / \
    A   E  remove 'D'                       A   E
     \       => 'C' is highest on left       \
      C         but need to move B to C       B
     /
    B
于 2012-07-16T14:48:40.237 に答える