此方法查找BST中的最大节点返回其值并将其删除。我在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;
}
答案 0 :(得分:2)
这个if和else没什么意义 -
if (cur->leftLink != NULL)
{
prev->rightLink = cur->leftLink;
}
else
{
prev->rightLink = NULL;
}
您尝试做的事情可以通过 - prev->rightLink = cur->leftLink;
您在此语句中获得访问冲突的原因是prev
未指向有效节点,即NULL
(初始化)时。
答案 1 :(得分:1)
如果树没有任何正确的子项,则prev将保持为null并且在执行时
prev->rightLink = cur->leftLink;
您正在尝试访问null变量的属性,因此“Access Voilation”。
答案 2 :(得分:1)
原因是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;
}
答案 3 :(得分:0)
您没有考虑tr
没有正确元素(tr->rightLink = NULL
,cur = tr
)的情况,因此while
循环的内容从不执行。在这种情况下,prev
仍为NULL
,这意味着您在尝试访问NULL
rightLink
元素时尝试取消引用prev
尝试取消引用NULL
会导致某种访问冲突错误。