2012-04-05 15 views
1

バイナリ検索ツリーに挿入しようとすると、私のプログラムでセグメンテーションフォルトが発生します。ここではノードの宣言があります:バイナリツリーのセグメンテーションフォルト

template < class T > class binTreeNode { 
friend class binTree <T>; 
friend class binSTree <T>; 
public: 
    // default constructor 
    binTreeNode (const T& newData =T(), binTreeNode <T>* newLeft = 0, binTreeNode <T>* newRight = 0) { 
     data = newData; 
     left = newLeft; 
     right = newRight; 
    } 
private: 
    T data; // data value in node 
    binTreeNode <T> *left, *right; // links to other nodes 
}; 

以下の関数は、(高機能とコンストラクタのような)他のすべての新しい、すべてがすべての親クラスで行われており、実際に関連してはなりません。新機能は以下のとおりです。私はチェックところ

template <class T> 
class binSTree : public binTree<T> { 
public: 
    void insert (const T& newData) { 
     if (root == NULL) { 
      root = new binTreeNode<T>(newData); 
     } 
     else 
      insert(root,newData); 
    } 
    bool search (const T& x) const { 
     if (root != NULL) 
      return search(root,x); 
     else 
      return false; 
    } 
    bool remove (const T& x) { 
     if (root == NULL) 
      return false; 
     remove(root,x); 
     return true; 
    } 
protected: 
    binTreeNode<T>* root; 
private: 
    void insert (binTreeNode<T>*& ptr, const T& x) { 
     if (ptr == NULL) {  // Base case, actual insertion 
      binTreeNode<T>* newNode; 
      newNode = new binTreeNode<T>(x); 
      ptr = newNode; 
      return; 
     } 
     if (x == ptr->data) 
      return; 
     else if (x < ptr->data) 
      insert(ptr->left,x); 
     else 
      insert(ptr->right,x); 
     return; 
    } 
    bool search (binTreeNode<T>* ptr, const T& x) const { 
     if (ptr->data == x) 
      return true; 
     else if (x < ptr->data && ptr->left != NULL) 
      search(ptr->left,x); 
     else if (ptr->right != NULL) 
      search(ptr->right,x); 
     else 
      return false; 
    } 
    binTreeNode<T>* remove (binTreeNode<T>* ptr, const T& x) { 
     if (ptr == NULL) 
      return NULL; 
     else if (ptr->data == x && leaf(ptr)) { 
      delete ptr; 
      ptr = NULL; 
      return ptr; 
     } 
     else if (ptr->data == x && !leaf(ptr)) 
      return ptr; 
     else if (x < ptr->data) { 
      ptr->left = remove(ptr->left,x); 
      return ptr; 
     } 
     else { 
      ptr->right = remove(ptr->right,x); 
      return ptr; 
     } 
    } 
    bool leaf (binTreeNode<T>* node) const { 
     if (node->left != NULL || node->right != NULL) 
      return false; 
     return true; 
    } 
}; 

セグメンテーションフォールト、valgrindのによると、もし(X == ptr->データ)の条件付きで、民間の挿入です。これはなぜ誰にも分かりますか?私は完全に壁に当たった。ありがとう:3

+0

'ptr'に有効なアドレスが含まれていることを確認しましたか? –

+0

これを拡張するために、 'NULL'チェックは、ポインタが' NULL'に初期化された場合(または同じように値がある場合)にのみ機能します。 'int * ptr;を実行すると、' 'ptr''は' 'NULL''ではない可能性が高いです。値は不定です。 –

+0

私のコンストラクタは、実際のデータが設定されていない場合はNULLにデータを設定するので、NULLまたは有効なデータのいずれかにする必要があります。 – Nathan

答えて

4

問題がまたはあなたのクラッシュの原因ではないかもしれないかもしれないが、確実に固定しなければならないあなたのremoveコードにあります:あなたは、あなたが再帰的にノードを削除になりptr->leftまたはptr->rightを削除するとき親のleftまたはrightポインタをNULLに設定する必要があります。さもなければ、あなたはあなたのコードをぶら下がっているポインタに関連したエラーに開きます。

+0

私のドライバプログラムは削除機能にも達していないので、これは特に問題ではありませんが、感謝します。 – Nathan

+0

'insert'関数は同じ問題を抱えています。子を持たないノードを追加するときは、 'left'と' right'ポインタをNULLに初期化してください。 – stanwise

+0

ptr-> leftとptr-> rightをnullに設定するように変更しましたが、何も変更されませんでした。 – Nathan

関連する問題