2012-05-01 3 views
0

セグメンテーションフォールトが返され続けるため、この機能を実行できません。私はそれを「削除ルート」に絞り込んだ。このエラーを修正する方法はわかりません。バイナリ検索ツリー内のすべての値を削除するとセグメンテーションフォルトが発生する

提案がありますか?

はここで割り当てに含ま事前と事後条件である:

//前提条件:rootはバイナリ検索 ツリーのルートへのポインタです。

// Postcondition:この関数は、バイナリ検索 ツリーのすべてのノードを削除し、// rootをNULLに設定します。

template<class Key, class Item> 
void tree_clear(bstNode<Item, Key>*& root) 
{ 
bstNode<Item, Key>* child; 
if(root != NULL) 
{ 
    child = root->left(); 
    tree_clear(child); 
    child = root->right(); 
    tree_clear(child); 
    delete root; 
    root = NULL; 
} 
} 
+0

非常に深いノードで - > left()および - > right()から返されるものは何ですか?これらの関数が最も深いノードでNULLを返さない場合は、segfaultを取得する可能性があります。 – akatakritos

+0

あなたのtree_clearは参照を必要とするので、tree_clear(NULL)を呼び出すのが悪いですか? –

+0

彼はNULLをチェックしています。私は、これらの関数が最も深いノードに対して呼び出されると、何らかのランダムなポインタを返すかもしれないと考えています。そのランダムポインタはヌルではないので、それをtree_clearにして削除しようとします。 – akatakritos

答えて

0

あなたの引数は、参照へのポインタである...私はそれがポインタへのポインタであるべきだと思う:

void tree_clear(bstNode<Item, Key>** root) 
+0

これはまだ私にセグメンテーション違反を与えます。私たちの教授が私たちにそれらを実装して欲しいので、関数プロトタイプを実際に変更することもできません。他のアイデア? –

+0

try delete * root; * root = NULL; ...あなたがそうするなら、あなたはあなたのガードをif(* root == NULL){}に変更する必要があります – Stretch

0

さてあなたは、署名を変更することができない場合、

を試してみてください
template<class Key, class Item> 
void tree_clear(bstNode<Item, Key>*& root) 
{ 
    bstNode<Item, Key>* child; 
    if(root != NULL) 
    { 
    if (child = root->left()) { 
     tree_clear(child); 
    } 
    if (child = root->right()) { 
     tree_clear(child); 
    } 
    delete root; 
    } 
} 
関連する問題