[英]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.