C ++在BST中删除只有一个孩子的节点时遇到麻烦

时间:2018-07-18 03:38:19

标签: c++ binary-search-tree

我在删除二进制搜索树中的节点时遇到困难。 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;
}

我的代码实际上在做什么,不仅是删除我要删除的节点,还包括删除其子节点。我可能做错了什么?内存分配有错误吗?我如何将值设置为子节点是否出错?

1 个答案:

答案 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已经执行了此检查。

相关问题