我在我的節目得到一個分段錯誤,當我嘗試插入到二叉搜索樹。這裏的節點聲明:段錯誤二叉樹
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
您確認'ptr'包含有效的地址嗎? – 2012-04-05 23:40:20
爲了擴大這一點,只有當指針初始化爲NULL(或恰好具有相同的值)時,「NULL」才檢查工作。如果我做'int * ptr;''ptr'可能* not *'NULL',它的值是不確定的。 – 2012-04-05 23:41:20
如果沒有設置實際數據,我的構造函數將數據設置爲NULL,所以它應該是NULL或有效數據。 – Nathan 2012-04-05 23:53:41