二进制搜索树 - 访问冲突

时间:2012-09-16 04:35:56

标签: c++ c data-structures

此方法查找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;
}

4 个答案:

答案 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 = NULLcur = tr)的情况,因此while循环的内容从不执行。在这种情况下,prev仍为NULL,这意味着您在尝试访问NULL rightLink元素时尝试取消引用prev

尝试取消引用NULL会导致某种访问冲突错误。