2017-01-29 18 views
-3

これは、問題が最初にif文にある私の挿入機能BSTにノードを挿入

void BinTree::insert(Node * temp, NodeData * insData) 
{ 
    if (temp == NULL) 
    { 

     temp = new Node; 
     temp->pData = insData; 
     temp->left = NULL; 
     temp->right = NULL; 
     return; 
    } 
     //recursively go left or right 
     //....rest of the function 
} 

の最初の部分です。いくつかのノードを追加しています。
ここに、挿入関数を呼び出す関数があります。

void BinTree::insertMiddle(NodeData* arr[], int bottom, int top) 
{ 


    if (bottom <= top) 
    { 
     int middle = (bottom + top)/2; 

     if (arr[middle] == NULL) 
     { 
      return; 
     } 
     else 
     { 
      insert(root, arr[middle]); 
      arr[middle] = NULL; 

      insertMiddle(arr, bottom, middle - 1); 
      insertMiddle(arr, middle + 1, top); 
     } 
    } 
    else 
    { 
     return; 
    } 
} 

すべてのノードを挿入した後も、ルートはまだNULLです。実際、insert関数の最初のif文は毎回trueになります。
最初の挿入後にはnullであってはなりません。
何かを削除したり、ルートをNULLに設定しているとは思わない。

コードに問題がありますか?

+2

このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低でも、あなたはあなたが行った観察と一緒に、[編集]あなたの質問あなたの問題を再現[、最小完全、かつ検証](http://stackoverflow.com/help/mcve)の例を含むようにする必要があります\しますデバッガ。 –

+1

これを繰り返します:**関数パラメータはローカル変数です。ローカル変数への代入は外部世界に影響を与えません**。 –

+0

ポインタが値渡しされていることに気づいていませんでした。私はそれが新しいポインタだと思ったが、渡されたポインタが指していたものと同じオブジェクトを指しているので、問題ではない。私は間違っていた。私の間違い。 – bhroask

答えて

2

コードの正当性を検証できませんが、現時点で直面している問題が発生していると思います。 insertは、ポインタtempをノードに持ち、割り当てられたノードをnewノードに変更します。しかしポインタtemp値によって渡され、それが渡されたパラメータのコピーを変更するための機能insert

temp = new Node; 

内の割り当ては、発信者に表示されません。あなたが関数内

insert(root, arr[middle]); 

(値渡し)パラメータtempの変更とそれを呼び出すとinsertは、発信者にrootの値を変更しません。

あなたは機能insertを参照によってパラメータを渡すためにそのプロトタイプを変更、呼び出し側から渡されたパラメータを変更する場合:

void BinTree::insert(Node*& temp, NodeData * insData) 
         ^^^ 

この方法は、一時はタイプpointer-to-Nodeのパラメータであり、あります参照渡し。ポインタへの変更があれば、呼び出し元コードに表示されます。