这段代码中,出现RE错误的原因是没有对空指针进行判断和处理。

在第1行代码中,如果root为空指针,那么在访问'root->sz'时会出现RE错误。

在第11行代码中,如果root的左子树和右子树都为空指针,那么在访问'root->l'和'root->r'时会出现RE错误。

要解决这个问题,可以在相关代码中添加对空指针的判断和处理。

修正后的代码如下:

void erase(int val, nd*& root)  // O(logn) 应先用isErasable判断
{
    if (root == nullptr) return;  // 对空指针进行判断和处理

    root->sz--;
    if (val == root->val)
    {
        root->cnt--;

        if (root->cnt > 0);
        else if (root->l != nullptr && root->r != nullptr)
        {
            nd* newNode = root->r;
            while (newNode->l != nullptr)
            {
                newNode = newNode->l;
            }
            root->val = newNode->val;
            root->cnt = newNode->cnt;
            erase(root->val, root->r);
        }
        else
        {
            nd* toErase = root;
            root = (root->l != nullptr) ? root->l : root->r;
            delete toErase;
        }
    }
    else if (val < root->val) erase(val, root->l);
    else if (val > root->val) erase(val, root->r);
    balance(root);
}

原文地址: https://www.cveoy.top/t/topic/pism 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录