2012-04-18 23 views
3

これまで何百万回も尋ねられていたかもしれませんが、何が問題なのか分かりません。私はインターネット上でコードを使用したくないので、私の心に何があるのか​​をプログラムしようとしました。どちらかまたは私の印刷機能が間違っています。下のコードに何か問題はありますか?バイナリ検索ツリーの挿入C++

void addNode(int value) 
    { 
     Node* newNode=new Node; 
     newNode->data=value; 
     if(root==NULL) 
      root=newNode; 
     else { 
      Node* temp=root,*parent; 
      while(temp!=NULL) 
      { 
       parent=temp; 
       if(temp->data == value) 
        return; 
       else if(temp->data < value) 
        temp=temp->left; 
       else 
        temp=temp->right; 
      } 
      temp=newNode; 
     } 
    } 
+0

ノードの 'left'または' right'メンバーを決して割り当てません。 –

+0

私は 'temp = temp-> left'と 'temp = temp-> right'を使用しています。それは数えませんか? – Ali

+0

@rolandbishop:いいえ。これはローカル変数を変更して別のノードを参照しますが、挿入ポイントが見つかるとツリーを変更しません。 –

答えて

6
temp=newNode; 

これは、関数戻り、新しいノードを失ったときに廃棄されるローカル変数へのポインタを割り当てます。その代わりに、ツリー内のポインタに割り当てる必要があります。おそらくのようなもの:

temp->right value < temp->data場合について
if (temp->data < value) {  // If the new node should be to the left 
    if (temp->left) {   // If there is a left subtree 
     temp = temp->left;  //  Move into the left subtree 
    } else {      // Otherwise 
     temp->left = newNode; //  Insert the new node there 
     return;     //  Done. 
    } 
} 

と同様に。また

if (temp->data == value) 
    return; 

あなたがメモリリークを持っています。返す前にdelete newNodeする必要があります。

+0

彼はまた、あなたがツリーの真ん中に挿入するケースも見逃していると思います。 –

+0

答えてくれてありがとう。私はちょっと混乱していると思うので、これは馬鹿になるかもしれないけど、temp-> leftを 'if(temp-> left')にチェックする理由を完全に理解していませんでした。 – Ali

+0

@JohnKalberer:ツリーのバランスをとることは最適化されています;基本的な作業を最初に行う方が良いでしょう。 –

関連する問題