2012-04-05 2 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 
}; 

기능입니다 다른 모든 새로운 모든 (높이 함수와 생성자 등) 모든 부모 클래스에서 수행하고, 정말 관련해서는 안됩니다. 이 새로운 기능은 : I 확인 여기서

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

관련 문제