[英]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 = NULL
, cur = tr
),因此while
循環的內容永遠不會執行。 在這種情況下, prev
仍為NULL
,這意味着您嘗試訪問prev
的rightLink
元素時嘗試取消引用NULL
。
嘗試取消引用NULL
將導致某種訪問沖突錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.