2012-04-05 124 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的,是在有條件私營插入其中I檢查(X == ptr->數據)。有沒有人有任何想法,爲什麼這是?我完全打了一堵牆。感謝:3

+0

您確認'ptr'包含有效的地址嗎? – 2012-04-05 23:40:20

+0

爲了擴大這一點,只有當指針初始化爲NULL(或恰好具有相同的值)時,「NULL」才檢查工作。如果我做'int * ptr;''ptr'可能* not *'NULL',它的值是不確定的。 – 2012-04-05 23:41:20

+0

如果沒有設置實際數據,我的構造函數將數據設置爲NULL,所以它應該是NULL或有效數據。 – Nathan 2012-04-05 23:53:41

回答

4

。在你的remove代碼中的問題,可能會或可能不會事業的崩潰,但絕對應該修正:當你遞歸刪除ptr->leftptr->right導致刪除節點,還應該將leftright父指針設置爲NULL;否則你會打開你的代碼來發現與懸掛指針相關的錯誤。

+0

我的驅動程序甚至沒有進入刪除功能,所以這不是特別的問題,但謝謝。 – Nathan 2012-04-05 23:49:28

+0

'insert'函數遭受同樣的問題。當添加一個沒有子節點的節點時,將它的'left'和'right'指針初始化爲'NULL'。 – stanwise 2012-04-05 23:51:52

+0

我修改它來設置ptr-> left和ptr-> right爲null,它沒有改變任何東西。 – Nathan 2012-04-05 23:57:09