【发布时间】:2012-04-05 23:37:36
【问题描述】:
当我尝试插入二叉搜索树时,我的程序出现分段错误。这是节点的声明:
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,分段错误出现在我检查 if (x == ptr->data) 的条件中的私有插入中。有谁知道这是为什么?我已经完全撞墙了。谢谢:3
【问题讨论】:
-
您确认
ptr包含有效地址吗? -
在此基础上进行扩展,
NULL仅在指针初始化为NULL(或恰好具有相同的值)时才进行检查。如果我做int *ptr;ptr可能不是NULL,它的价值是不确定的。 -
如果没有设置实际数据,我的构造函数会将数据设置为 NULL,因此它应该是 NULL 或有效数据。
-
驱动函数中的 T 类型是内置类型,还是您自己的类之一?如果它是您的类之一,它是否定义了自定义 == 运算符?
-
它们是整数,没什么特别的。
标签: c++ binary-tree binary-search-tree