У меня возникли небольшие проблемы с размышлениями, как, черт возьми, я исправляю соответствующие указатели при попытке удалить узел из двоичного дерева, где у этого узла есть 2 дочерних элемента.
Я понимаю основную концепцию, и у меня просто проблемы с исправлением указателей ...
Итак, в основном, моя функция удаления в основном выполнена, и каждый кейс уже работает (что касается моего обширного тестирования, все работало нормально), я пропускаю только узел кейс с 2 дочерними элементами. Допустим, мы находимся внутри else if
, который имеет дело с этим случаем:
У меня там будет 2 указателя, currPtr
, который содержит удаляемый узел, prevPtr
, который содержит родительский узел. У меня также есть переменная с именем fromLeft
, которая определяет, исходит ли родительский элемент currPtr
от левого или правого указателя на prevPtr
. Затем у меня есть вызов другой функции с именем extractMin(Tree *t)
, которая извлекает самое низкое значение в дереве. Если я вызову эту функцию с currPtr->right
в качестве аргумента, преемник currPtr
будет извлечен из дерева (функция удалит его из дерева, исправит указатели и вернет указатель узла). Указатель-преемник будет сохранен на tempPtr
.
Вот структура моего дерева:
typedef int TreeElement;
typedef struct sTree {
TreeElement item;
struct sTree *left;
struct sTree *right;
} Tree;
И код для функции извлечения:
Tree *extractMin(Tree *tree) {
Tree *prevPtr = NULL;
Tree *currPtr = tree;
while(currPtr->left) {
prevPtr = currPtr;
currPtr = currPtr->left;
}
if(prevPtr) prevPtr->left = currPtr->right;
// inorder successor
return currPtr;
}
В приведенном выше коде отсутствует случай, когда у дерева есть только один узел, корневой узел, он не будет работать должным образом, а также не проверяет, есть ли у дерева какие-либо узлы, но работает, когда дерево имеет несколько узлов.
Итак, как мне исправить необходимые указатели на else if
для удаления узла? Также помните, что указатели left
и right
на узлах дерева всегда будут указывать куда-то или будут NULL
.
Кстати, я хочу сделать эту итерацию.