簡體   English   中英

在Visual Studio中刪除二進制搜索樹中的節點中的訪問沖突異常

[英]Access Violation Exception in Visual Studio in Deletion of node in Binary Search Tree

運行BST Deletion時出現異常。 以下是我的代碼段:

Bst::node * Bst::del(node *root, int num)
{
    if (root == NULL)
    {
        return root;
    }
    else if (num < root->data)
    {
        root->left = del(root->left, num);
    }
    else if (num > root->data)
    {
        root->right = del(root->right, num);
    }
    else
    {
        if (root->left == NULL)
        {
            node * tmp = root;
            root = root->right;
            delete tmp;
        }
        else if (root->right == NULL)
        {
            node * tmp = root;
            root = root->left;
            delete tmp;
        }
        else if (root->left == NULL && root->right == NULL)
        {
            delete root;
            root = NULL;
        }
        else
        {
            node *tmp = root;
            tmp = findMin(root->right);
            root->data = tmp->data;
            root->right = del(root->right, tmp->data);
        }
    }


    return root;
}

////////////////////////////////////////////////// //////////////////////

void Bst::del(int num)
{
    del(root, num);
}

當我刪除其他節點時,一切正常,但是當我刪除根節點本身時,函數void Bst::del(int num)從函數Bst::node * Bst::del(node *root, int num) 當我將函數重寫為時,錯誤得到解決

  void Bst::del(int num)
        {
            root = del(root, num);
        }

問題1.為什么當我刪除中間節點或除根節點之外的任何其他節點時,它可以工作。 在調試時,我發現當執行函數Bst::node * Bst::del(node *root, int num)時,即使root也被正確刪除Bst::node * Bst::del(node *root, int num)但是當調用返回到void Bst::del(int num)根的價值沒有得到保留,是垃圾。

問題2:為什么將返回值存儲在變量root中時,錯誤會得到解決?

假設您有一個名為root的成員變量,那么問題可能是因為您在刪除函數中用參數root屏蔽了成員變量root 因此,當您在函數中執行root = NULL時,僅將參數設置為NULL而不將成員變量設置為。

root的其他分配也存在問題,它們只會分配給局部參數,而不是成員變量。

我認為,您所做的修復(在調用函數中分配為root )是最正確的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM