我在删除二进制搜索树中的节点时遇到困难。 delete函数是Node类的一部分,而findMin函数也是。下面是我的删除功能...
/**********************************************
* Delete
**********************************************/
node* node::Delete(node *root, string stuff)
{
//node *temp;
if (root == NULL) // Searches for value in tree
return NULL;
if (stuff < root->val) // String is in left subtree
root->left = Delete(root->left, stuff);
else if (stuff > root->val) // String is in right subtree
root->right = Delete(root->right, stuff);
else
{ // No children
if ((root->left == NULL) && (root->right == NULL))
{
delete(root);
root = NULL;
}
else if ((root->right == NULL) && (root->left != NULL)) // One left child node
{
node *temp = root;
root = root->left;
delete temp;
temp = NULL;
}
else if ((root->left == NULL) && (root->right!= NULL)) // One right child node
{
node *temp = root;
root = root->right;
delete temp;
temp = NULL;
}
else // Two children
{
node *temp = findMin(root->right); // Finds smallest value in right subtree
root->val = temp->val;
root->right = Delete(root->right, temp->val);
}
}
return root;
}
下面是我的析构函数,它给了我SIGABRT(我正在使用Xcode)
/**********************************************
* Destructor
**********************************************/
node::~node()
{
if (left != NULL) delete left;
if (right != NULL) delete right;
}
我的代码实际上在做什么,不仅是删除我要删除的节点,还包括删除其子节点。我可能做错了什么?内存分配有错误吗?我如何将值设置为子节点是否出错?
答案 0 :(得分:0)
在删除节点之前,您需要使指向左和右的指针为空。 您致电:
node *temp = root;
root = root->left;
delete temp;
temp = NULL;
当您“删除临时文件”时,您将删除仍指向root-> left和root-> right的节点,并且析构函数确保它们也被删除。您应该改为执行以下操作:
node *temp = root;
root = root->left;
temp->left = NULL;
temp->right = NULL;
delete temp;
temp = NULL;
在析构函数中,您也不需要检查它们是否等于null,因为delete已经执行了此检查。