问题描述
因此在删除期间出现异常问题(抛出异常:读取访问冲突。 父对象是0x158398。)就像有时是不同的数字等,并且总是关于父对象/指针,我的代码运行正常,没有任何错误,直到100k对象异常有时才工作,因为1百万甚至不再工作。能帮上大忙。在帖子中发布代码:
节点类:
template <class T>
class Node {
public:
T data;
Node<T>* Left = NULL;
Node<T>* Right = NULL;
};
用于查找右侧子树的最小值的代码:
Node<T>* findMin(Node<T>* node)
{
while (node->Left != NULL)
node = node->Left;
return node;
}
void Delete(Node<T>*& node) {
if (node == NULL)
return;
Node<T>* parent = findParentForDelete(this->root,node);
Node<T>* temp = NULL;
//leafs
if (node->Left == NULL && node->Right == NULL) {
if (node == root) {
delete root;
root = NULL;
return;
}
else {
if (parent->Left == node) //line with exception
parent->Left = NULL;
else
parent->Right = NULL;
delete node;
node = NULL;
return;
}
}
//1 child left not null
else if (node->Left != NULL && node->Right == NULL)
{
if (node == root) {
temp = root->Left;
delete root;
root = NULL;
root = temp;
return;
}
else {
if (parent->Left == node)
parent->Left = node->Left;
else
parent->Right = node->Left;
delete node;
node = NULL;
return;
}
}
//1 child Right not null
else if (node->Left == NULL && node->Right != NULL)
{
if (node == root) {
temp = root->Right;
delete root;
root = NULL;
root = temp;
return;
}
else {
if (parent->Left == node)
parent->Left = node->Right;
else
parent->Right = node->Right;
delete node;
node = NULL;
return;
}
}
//2 childs
else if (node->Left != NULL && node->Right != NULL)
{
temp = findMin(node->Right);
T data = temp->data;
Delete(temp);
node->data = data;
}
}
寻找父母:
Node<T>* findParentForDelete(Node<T>* node,Node<T>*& nodetoFind)
{
if (node == NULL)
return NULL;
if (node->Left == NULL && node->Right == NULL)
return NULL;
if ((node->Left != NULL && node->Left == nodetoFind)
|| (node->Right != NULL && node->Right == nodetoFind))
return node;
if (node->data->age > nodetoFind->data->age)
return findParentForDelete(node->Left,nodetoFind);
if (node->data->age < nodetoFind->data->age)
return findParentForDelete(node->Right,nodetoFind);
}
解决方法
findParentForDelete
并不总是返回值。
如果您要查找的节点的年龄与树中的其他节点相同,则不会返回值,因此返回给调用方的值将是垃圾值。
如果在编译时提高警告级别,大多数编译器都会对此发出警告。