Я пытался создать сбалансированное двоичное дерево поиска и в настоящее время делаю функцию удаления. И способ, которым я пытаюсь удалить элементы, работал в функциях вращения.
Вот функция вращения:
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 ( я пытаюсь удалить этот узел)
весь код