Указатели в дереве удаления AVL - PullRequest
0 голосов
/ 29 мая 2020

Я пытался создать сбалансированное двоичное дерево поиска и в настоящее время делаю функцию удаления. И способ, которым я пытаюсь удалить элементы, работал в функциях вращения.

Вот функция вращения:

void rightRotation(Object** currentNode)
    {
        auto child = (*currentNode)->leftChild;
        auto c_bf = child->getBalanceFactor();

        if (c_bf > 0) // RR rotation
        {
            auto originalNode = *currentNode;
            originalNode->leftChild = child->rightChild;
            child->rightChild = originalNode;
            *currentNode = child;
        }
        else // RL rotation
        {
            // -L part of the rotation
            auto originalChild = child;
            child = child->rightChild;
            (*currentNode)->leftChild = child;
            originalChild->rightChild = child->leftChild;
            child->leftChild = originalChild;
            // R- part of the rotation
            auto originalNode = *currentNode;
            originalNode->leftChild = child->rightChild;
            child->rightChild = originalNode;
            *currentNode = child;
        }
    }

Итак, функция берет адрес адреса узла и заменяет этот адрес узла с адресом нового узла (дочернего).

И я пытаюсь построить функцию удаления вокруг того же logi c, но это не работает, и я не могу понять почему.

Вот функция удаления:

void del(Object** node)
    {
        if ((*node)->leftChild == NULL and (*node)->rightChild == NULL) // current node is a leaf
        {
            delete (*node);
            (*node) = NULL;

            //return;
        }
        else if ((*node)->rightChild == NULL)
        {
            auto newNode = (*node)->leftChild;
            delete (*node);
            (*node) = newNode;

            //return;
        }
        else if((*node)->leftChild == NULL)
        {
            auto newNode = (*node)->rightChild;
            delete (*node);
            (*node) = newNode;

            //return;
        }
        else // we have both childs 
        {
            // find the smallest element bigger than the current node
            // it will be the leftest element of the right child

            auto replacementNode = (*node)->rightChild;
            while (replacementNode->leftChild != NULL)
                replacementNode = replacementNode->leftChild;

            auto copy = new Object(*replacementNode);
            copy->leftChild = (*node)->leftChild;
            copy->rightChild = (*node)->rightChild;
            delete (*node);
            (*node) = copy;
            del(&replacementNode);
        }

        balance();
    }

Я пробовал отладку, и адрес, который попадает в функцию удаления, не совпадает с адресом, который я получил от & this -> root -> leftChild ( я пытаюсь удалить этот узел)

весь код

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...