Удаление узла бинарного дерева - C (СИ)
Формулировка задачи:
Бьюсь над задачей битый час, в функцию передаю указатель на узел, который и хотим удалить. И в зависимости от того как удалился возвращаю различные задачи.
вот функция , чистый си
int del(struct treeNode **tempPtr) { struct treeNode *ptr=NULL,*ptrX=NULL; if (*tempPtr == NULL) return -1; else if ((*tempPtr)->leftPtr == NULL && (*tempPtr)->rightPtr == NULL){ free(*tempPtr); *tempPtr = NULL; tempPtr = NULL; return 1; } else if ((*tempPtr)->leftPtr != NULL && (*tempPtr)->rightPtr == NULL){ ptr = *tempPtr; *tempPtr = ptr->leftPtr; free(ptr); return 2; } else if((*tempPtr)->leftPtr == NULL && (*tempPtr)->rightPtr != NULL){ ptr = *tempPtr; tempPtr=ptr->rightPtr); free(ptr); return 3; } else { *ptr = *tempPtr; ptrX = *tempPtr; ptr = ptr->leftPtr; while(ptr->rightPtr != NULL) ptr=ptr->rightPtr; if (ptr->leftPtr == NULL ){ tempPtr = &ptr; ptrX->rightPtr=(*tempPtr)->rightPtr; ptr = NULL; } else { tempPtr = &ptr; ptr = ptr->leftPtr ; ptr->rightPtr = PtrX->rightPtr; } free(ptr); return 4; } }
Решение задачи: «Удаление узла бинарного дерева»
textual
Листинг программы
void BinaryTree::Remove(int value) { Node * pointer = _root; Node * parent = NULL; while (pointer != NULL && pointer->value != value) { parent = pointer; if (value < pointer->value) pointer = pointer->left; else pointer = pointer->right; } if (pointer != NULL) { Node * removed = NULL; if (pointer->left == NULL || pointer->right == NULL) { Node * child = NULL; removed = pointer; if (pointer->left != NULL) child = pointer->left; else if (pointer->right != NULL) child = pointer->right; if (parent == NULL) _root = child; else { if (parent->left == pointer) parent->left = child; else parent->right = child; } } else // (pointer->left != NULL && pointer->right != NULL) { Node * mostLeft = pointer->right; Node * mostLeftParent = pointer; while (mostLeft->left != NULL) { mostLeftParent = mostLeft; mostLeft = mostLeft->left; } pointer->value = mostLeft->value; removed = mostLeft; if (mostLeftParent->left == mostLeft) mostLeftParent->left = NULL; else mostLeftParent->right = NULL; } cout << removed << " deleted" << endl; delete removed; } }
Объяснение кода листинга программы
Код удаляет узел из бинарного дерева.
- Переменная
root
содержит указатель на корень дерева. - Переменная
pointer
инициализируется значениемroot
и используется для обхода дерева в ширину. - Переменная
parent
инициализируется значениемNULL
и используется для хранения родительского узла текущего узла. - В цикле
while
происходит обход дерева в ширину до тех пор, пока не будет найдено совпадение или не будут проверены все узлы. - Если узел, который нужно удалить, является листовым узлом (у него нет потомков), то он удаляется и заменяется на
NULL
. - Если узел имеет только одного потомка, то этот потомк становится новым узлом на месте текущего узла.
- Если узел имеет двух потомков, то нужно найти наиболее левый узел в правой поддереве и заменить текущий узел на этот наиболее левый узел.
- После удаления узла,
pointer
иparent
сбрасываются вNULL
. - Выводится сообщение об удалении узла и сам удаленный узел освобождается с помощью
delete
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д