2016-11-03 7 views
0
if(parent!=NULL) 
    { 
     if((parent->leftChildPtr)==nodePtr) 
     { 
      parent->leftChildPtr=nodePtr->leftChildPtr; 
     } 
     else if(parent->rightChildPtr==nodePtr) 
     { 
      parent->rightChildPtr=nodePtr->leftChildPtr; 
     } 
    } 
    delPtr = nodePtr; 
    nodePtr = nodePtr->leftChildPtr; 

    delPtr->leftChildPtr = NULL; 
    delete delPtr; 

私はこのif命令をremoveItem関数内に持っています。私はデータ漏れがどのように発生するのか分かりません。ご覧のとおり、削除するノードをdelPtrという別のポインタで指し、次にnodeptrを正しいものに設定し、delptrとその内容を削除します。したがって、このNodePtrの親は、その子として "nodePtr's rightchildptr"も見なければならないが、そうではない。BSTからノードを削除したときにデータ漏れが発生する

+0

[Valgrind](http://valgrind.org/)とより多くのコンテキスト([mcve])を表示するのは、ここのあなたの友人です。 – user4581301

+1

'nodePtr-> rightChildPtr'はnullでないことが許されていますか? 'nodePtr'を削除している間はどこにもコピーしないからです。それ以外の場合は、提供された制限付きコードでは特定できません。 [mcve]の表示を検討してください。 –

答えて

0

もっとコードを表示する必要がありますが、nodePtrを設定している間は、親ノードの適切な子ポインタを更新していない可能性があります。それで、nodePtrの以前の値はまだ保持されていますが、これは削除されたので無効です。

関連する問題