바이너리 검색 트리에 삽입하려고하면 프로그램에서 세그먼트 화 오류가 발생합니다. 여기 노드의 선언입니다 : 아래바이너리 트리의 세그먼트 화 오류
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
'ptr'에 유효한 주소가 포함되어 있는지 확인하셨습니까? –
그걸 확장하기 위해서,'NULL' 검사는 포인터가'NULL'으로 초기화되었거나 (같은 값을 가지고있을 때만) 작동합니다. 만약 내가'int * ptr;을한다면''ptr'은''NULL''이 아닌 가능성이 높습니다. 값은 불확실합니다. –
실제 데이터가 설정되어 있지 않으면 내 생성자가 데이터를 NULL로 설정하므로 NULL이거나 유효한 데이터 여야합니다. – Nathan