Я пытаюсь удалить из узла из BST, когда у узла есть 2 дочерних элемента, и я сталкиваюсь с проблемой, которую не могу понять.
void deleteNode(NODE ** ROOT, int data)
{
printf("Root: %d\nData: %d\n", (*ROOT)->data, data);
NODE * nodeToDelete = searchTree(ROOT, data);
if(nodeToDelete == NULL)
{
printf("Node was not found and could not delete from tree.\n");
return;
}
else {
// There are three cases for deleting a Node.
// 1. Node we're deleting has no Children.
// 2. Node we're deleting has 1 child.
// 3. Node we're deleting has 2 children.
if(data == (*ROOT)->data)
{
if((*ROOT)->leftChild == NULL && (*ROOT)->rightChild == NULL)
{
printf("Deleting %d\n", (*ROOT)->data);
free(*ROOT);
return;
}
else if((*ROOT)->leftChild != NULL && (*ROOT)->rightChild == NULL)
{
NODE * temp = (*ROOT)->leftChild;
(*ROOT) = temp;
free((*ROOT)->leftChild);
return;
}
else if((*ROOT)->rightChild != NULL && (*ROOT)->leftChild == NULL)
{
NODE * temp = (*ROOT)->rightChild; // Create a pointer to the current Root's Right Child.
(*ROOT) = temp; // Set the current root to it's right child.
free((*ROOT)->rightChild); // Free the right child from memory.
return;
}
else { // Case #3: Two Children.
NODE * min = findMinimumNode(&(*ROOT)->rightChild);
printf("Min: %d\n", min->data);
int minValue = min->data;
(*ROOT)->data = minValue;
deleteNode(&(*ROOT)->rightChild, minValue);
}
}
else if(data < (*ROOT)->data)
{
if((*ROOT)->leftChild != NULL)
deleteNode(&(*ROOT)->leftChild, data);
else
return;
}
else if(data > (*ROOT)->data)
{
if((*ROOT)->rightChild != NULL)
deleteNode(&(*ROOT)->rightChild, data);
else
return;
}
}
}
Первые два случая, когда нет детей, и когда есть только 1 ребенок, работает отлично.У меня также есть метод findMinimumNode, который возвращает минимальный узел поддерева.Мое текущее дерево: 3 10 15 17 27 35 37 45 67 71 82
Когда я пытаюсь удалить 45, 45 следует заменить на 67, так как 45 имеет двух дочерних элементов, а правое поддерево минимального значения 4567. Я пытаюсь заменить 45 на 67, затем пройти справа от нового 67, который равен 71, и удалить старый 67, который находится слева от 71.
Но он продолжает печатать этовыход: 3 10 15 17 27 35 37 67