Удаление дерева - C (СИ)
Формулировка задачи:
НЕ работает удаление дерева. Программа вызывает срабатывание точки остановы.
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <locale.h> struct tree{ int inf; struct tree *L; struct tree *R; }; void createTree(struct tree *N) { struct tree *T; int x; printf("Введите левого сына для %d, если левого сына нет, то введите любой символ, не являющийся числом.\n",N->inf); fflush(stdin); if (scanf("%d", &x) != 0) { T = (struct tree*)malloc(sizeof (struct tree*)); T->L = NULL; T->R = NULL; T->inf = x; N->L = T; createTree(T); } printf("Введите правого сына для %d, если левого сына нет, то введите любой символ, не являющийся числом.\n",N->inf); fflush(stdin); if (scanf("%d", &x) != 0) { T = (struct tree*)malloc(sizeof (struct tree*)); T->L = NULL; T->R = NULL; T->inf = x; N->R = T; createTree(T); } return; } void pObhod(struct tree *N) { printf("%d ", N->inf); if(N->L) pObhod(N->L); if(N->R) pObhod(N->R); } void delete(struct tree *N) { struct tree *x=NULL, *y=NULL; if (N->R) x = N->R; if (N->L) y = N->L; free (N); if (x) delete(x); if (y) delete(y); } int main() { struct tree *Root, *N; int a; setlocale(0,""); printf("Введите корень (число) -> "); if (scanf("%d", &a) == 0) { printf("Некорректный корень.\n"); return 0; } Root = (struct tree*)malloc(sizeof(struct tree*)); Root->inf = a; Root->L = NULL; Root->R = NULL; createTree(Root); printf("Прямой обход промежуточного дерева -> "); pObhod(Root); printf("\n"); delete(Root); printf("\n"); return 0; }
Решение задачи: «Удаление дерева»
textual
Листинг программы
void delete(struct tree *N) { if (N == NULL) return; /*вылазим из рекурсии*/ delete(N->L);/*левое удаляем*/ delete(N->R);/*правое удаляем*/ free(N); /*удаляем себя*/ }
Объяснение кода листинга программы
- Входной параметр функции -
N
, это указатель на узел дерева. - Если
N
равенNULL
, то функция сразу возвращает управление. - Рекурсивный вызов функции
delete
для левого поддерева, передавая в качестве аргументаN->L
. - Рекурсивный вызов функции
delete
для правого поддерева, передавая в качестве аргументаN->R
. - Вызов функции
free
для освобождения памяти, выделенной под узелN
. N
содержит указатель на левое поддерево (L
), и на правое поддерево (R
).- В случае, если
N
является листом (у него отсутствуют и левое, и правое поддеревья), то после вызова функцииfree
дляN
, управление возвращается в точку вызова функцииdelete
. - Если узел
N
имеет и левое, и правое поддеревья, то после вызова рекурсивных функцийdelete
для левого и правого поддеревьев, управление возвращается в точку вызова функцииdelete
. - Если узел
N
имеет только левое поддерево, то после вызова рекурсивной функцииdelete
для левого поддерева, управление возвращается в точку вызова функцииdelete
. - Если узел
N
имеет только правое поддерево, то после вызова рекурсивной функцииdelete
для правого поддерева, управление возвращается в точку вызова функцииdelete
. - После вызова функции
free
дляN
, указательN
становится недействительным. - При каждом вызове рекурсивной функции
delete
для левого или правого поддерева, соответствующее поддерево удаляется, и управление возвращается в точку вызова функцииdelete
. - Если узел
N
имеет и левое, и правое поддеревья, то порядок их удаления не важен. - Если узел
N
имеет только левое поддерево, то после удаления левого поддерева, управление возвращается в точку вызова функцииdelete
. - Если узел
N
имеет только правое поддерево, то после удаления правого поддерева, управление возвращается в точку вызова функцииdelete
. - Функция
delete
вызывает функциюfree
для каждого узла дерева, начиная с корня и до листьев. - Функция
free
освобождает память, выделенную под каждый узел дерева, начиная с корня и до листьев. - В случае, если дерево имеет только один узел (корень), то после вызова функции
free
для этого узла, управление возвращается в точку вызова функцииdelete
. - Если дерево пустое, то после вызова функции
free
дляN
, управление возвращается в точку вызова функцииdelete
. - Если дерево не пустое, то после удаления всех узлов дерева, управление возвращается в точку вызова функции
delete
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д