繁体   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