Дерево: Как правильно удалить все узлы дерева? - C (СИ)
Формулировка задачи:
Как правильно удалить все узлы дерева?
Решение задачи: «Дерево: Как правильно удалить все узлы дерева?»
textual
Листинг программы
int destroyTree(Tree croot)
{
if(croot!=NULL){
croot->left = destroyTree(croot->left);
croot->right = destroyTree(croot->right);
free(croot);
}
return 0;
}
Объяснение кода листинга программы
В данном коде реализован рекурсивный алгоритм для удаления всех узлов из дерева.
- Входной параметр функции —
croot— это указатель на корень дерева. - Если
crootне равенNULL, то это означает, что дерево не является пустым. - Рекурсивная функция
destroyTreeвызывается для левого поддерева (указательcroot->left) и сохраняет результат в переменнуюcroot->left. - Рекурсивная функция
destroyTreeвызывается для правого поддерева (указательcroot->right) и сохраняет результат в переменнуюcroot->right. - Затем освобождается память, выделенная под узел
croot(с помощью функцииfree). - Если дерево пустое, то возвращается
0. - В противном случае, возвращается результат вызова
destroyTreeдля левого поддерева (если дерево не симметрично). - Если дерево симметрично, то возвращается результат вызова
destroyTreeдля правого поддерева. - Если в вызове
destroyTreeдля левого или правого поддерева возникла ошибка (например, попытка освободить память, которая уже была освобождена), то возвращается отличное от0значение, что позволяет отличить такую ошибку от ошибки в другом поддереве. - В итоге, после завершения рекурсивных вызовов
destroyTree, все узлы дерева будут удалены, а память, выделенная под дерево, будет освобождена.