Удаление дерева - 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); /*удаляем себя*/
}

Объяснение кода листинга программы

  1. Входной параметр функции - N, это указатель на узел дерева.
  2. Если N равен NULL, то функция сразу возвращает управление.
  3. Рекурсивный вызов функции delete для левого поддерева, передавая в качестве аргумента N->L.
  4. Рекурсивный вызов функции delete для правого поддерева, передавая в качестве аргумента N->R.
  5. Вызов функции free для освобождения памяти, выделенной под узел N.
  6. N содержит указатель на левое поддерево (L), и на правое поддерево (R).
  7. В случае, если N является листом (у него отсутствуют и левое, и правое поддеревья), то после вызова функции free для N, управление возвращается в точку вызова функции delete.
  8. Если узел N имеет и левое, и правое поддеревья, то после вызова рекурсивных функций delete для левого и правого поддеревьев, управление возвращается в точку вызова функции delete.
  9. Если узел N имеет только левое поддерево, то после вызова рекурсивной функции delete для левого поддерева, управление возвращается в точку вызова функции delete.
  10. Если узел N имеет только правое поддерево, то после вызова рекурсивной функции delete для правого поддерева, управление возвращается в точку вызова функции delete.
  11. После вызова функции free для N, указатель N становится недействительным.
  12. При каждом вызове рекурсивной функции delete для левого или правого поддерева, соответствующее поддерево удаляется, и управление возвращается в точку вызова функции delete.
  13. Если узел N имеет и левое, и правое поддеревья, то порядок их удаления не важен.
  14. Если узел N имеет только левое поддерево, то после удаления левого поддерева, управление возвращается в точку вызова функции delete.
  15. Если узел N имеет только правое поддерево, то после удаления правого поддерева, управление возвращается в точку вызова функции delete.
  16. Функция delete вызывает функцию free для каждого узла дерева, начиная с корня и до листьев.
  17. Функция free освобождает память, выделенную под каждый узел дерева, начиная с корня и до листьев.
  18. В случае, если дерево имеет только один узел (корень), то после вызова функции free для этого узла, управление возвращается в точку вызова функции delete.
  19. Если дерево пустое, то после вызова функции free для N, управление возвращается в точку вызова функции delete.
  20. Если дерево не пустое, то после удаления всех узлов дерева, управление возвращается в точку вызова функции delete.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.667 из 5
Похожие ответы