簡體   English   中英

二進制搜索樹-訪問沖突

[英]Binary Search Tree - Access Violation

此方法在BST中找到最大的節點,並返回其值並將其刪除。 我在prev->rightLink = cur->leftLink;遇到訪問沖突prev->rightLink = cur->leftLink; 我相對不熟悉C ++,無法找到原因。

int CTree::popLargest(TreeNode* tr)
{   
    int largest;
    TreeNode* prev = NULL;
    TreeNode* cur = tr;

    while (cur->rightLink != NULL)
    {
        prev = cur;
        cur = cur->rightLink;
        largest = cur->info;
        //DeleteAttemptTwo(tr, largest);//DeleteItem(largest);     
    }

    if (cur->leftLink != NULL)
    {
        prev->rightLink = cur->leftLink;
    }
    else 
    {
        prev->rightLink = NULL;
    }

    return largest;
}

如果這樣,那么就沒有意義了-

if (cur->leftLink != NULL)
{
    prev->rightLink = cur->leftLink;
}
else 
{
    prev->rightLink = NULL;
}

您要嘗試執行的操作只需prev->rightLink = cur->leftLink;

而且您在此語句上獲得訪問沖突的原因是prev指向的不是有效節點,即節點為NULL (已初始化)。

如果tree沒有任何合適的子代,則prev將保持為null並在執行時

prev->rightLink = cur->leftLink;

您正在嘗試訪問null變量的屬性,因此要訪問“訪問錯誤”。

原因是prev仍然為NULL。 取消引用時,應驗證指針是否為NULL。順便說一句,通過調試很容易找到此問題。

const int INVALID_VALUE = -1;    // change it by yourself.
int CTree::popLargest(TreeNode* tr)
{  
    int largest = INVALID_VALUE;
    if (tr != NULL)
    {
        TreeNode* prev = NULL;
        TreeNode* cur = tr;
        while (cur->rightLink != NULL)
        {
            prev = cur;
            cur = cur->rightLink;
            largest = cur->info;
            //DeleteAttemptTwo(tr, largest);//DeleteItem(largest);     
        }
        if (prev != NULL)
        {
            if (cur->leftLink != NULL)
            {
                prev->rightLink = cur->leftLink;
            }
            else 
            {
                prev->rightLink = NULL;
            }
        }
    }
    return largest;
}

您沒有考慮tr沒有正確元素的情況( tr->rightLink = NULLcur = tr ),因此while循環的內容永遠不會執行。 在這種情況下, prev仍為NULL ,這意味着您嘗試訪問prevrightLink元素時嘗試取消引用NULL

嘗試取消引用NULL將導致某種訪問沖突錯誤。

暫無
暫無

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

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