Найти количество листьев в дереве - C (СИ)
Формулировка задачи:
Здравствуйте, у меня вроде все получилось сделать, только, почему всегда ответ получается 0, как это можно исправить
#include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <string.h> //структура, описывающая узел бинарного дерева typedef struct node { char str[200]; int kol; node *left; node *right; } tree; void create(tree **root); void add(tree **root, char word[], int i); void print(tree *root);//Обход в прямом порядке void print2(tree *root);//Симметричное отображение void print3(tree *root);//реверсивный вывод int list_count(tree *root); int main() { int result = 0; tree *root = NULL; create(&root);//создание print(root);//вывод прямой // print2(root); //симметричный // print3(root); //реверсивный list_count(root); printf("\n%d\n", result); return 0; } void create(tree **root) { FILE *in; int i = 0; char word[20]; char a; if((in = fopen("C:\\text.txt", "r")) == NULL) { printf("\nError opening file\n"); } else { while(!feof(in)) { fread(&a, sizeof(char), 1, in); if(a != ' ') { if(a != '\n') { word[i] = a; word[i + 1] = '\0'; i++; } } if(( a == ' ') || (a == '\n')) { add(root, word, i); i = 0; } } } fclose(in); } void add(tree **root, char word[], int i) { if((*root) == NULL) { (*root) = (tree *)malloc(sizeof(node)); strncpy((*root)->str, word, sizeof(char) * (i + 1)); (*root)->kol = 1; (*root)->right = NULL; (*root)->left = NULL; return; } if(strcmp(word, (*root)->str) > 0) { add(&(*root)->right, word, i); } else if(strcmp(word, (*root)->str) < 0) { add(&(*root)->left, word, i); } else (*root)->kol++; } void print(tree *root) //в прямом порядке { if (root!=NULL) { printf("Word: %s\t \tNumber tree: %d\t\n",root->str, root->kol); print(root->left); print(root->right); } } void print2(tree *root)//симметричный порядок { if (root!=NULL) { print2(root->left); printf("Word: %s\t \tNumber tree: %d\t\n",root->str, root->kol); print2(root->right); } } void print3(tree *root)//реверсивный вывод { if (root!=NULL) { print3(root->left); print3(root->right); printf("Word: %s\t \tNumber tree: %d\t\n",root->str, root->kol); } } int list_count(tree *root) { int result; if ((root->left==NULL)&&(root->right==NULL)) { result = 1; } else { result = 0; } if (root->left) { result += list_count(root->left); } if (root->right) { result += list_count(root->right); } return result; }
Найдите ошибку или как посоветуете исправить
Люди, это же должно быть просто
Решение задачи: «Найти количество листьев в дереве»
textual
Листинг программы
int list_count(tree *root) { int result; if (root==NULL) { result = 0; } else if ((root->left==NULL)&&(root->right==NULL)) { result = 1; } else { result = list_count(root->left) + list_count(root->right); } return result ; }
Объяснение кода листинга программы
В данном коде реализована рекурсивная функция list_count, которая подсчитывает количество листьев (nodess) в дереве.
- Если переданный ей указатель на узел root равен NULL, то это означает, что дерево пустое, и она возвращает 0.
- Если узел root имеет только один лист, то возвращает 1.
- В противном случае, рекурсивно вызывает саму себя для левого и правого поддеревьев от узла root, и возвращает их суммы. Таким образом, данный код вычисляет количество листьев в дереве, начиная с его вершины и последовательно перебирая все узлы. Список переменных и их значений:
- int list_count(tree *root) — объявление функции list_count
- int result — результат работы функции
- tree *root — указатель на узел дерева, с которого начинается подсчет
- if (root==NULL) — проверка, является ли корневой узел пустым
- { result = 0; } — если дерево пустое, то возвращаем 0
- else if ((root->left==NULL)&&(root->right==NULL)) — проверка, является ли узел листом
- { result = 1; } — если узел является листом, то возвращаем 1
- else — если узел не является листом
- { result = list_count(root->left) + list_count(root->right); } — рекурсивный вызов функции для левого и правого поддеревьев
- return result; — возвращаем результат подсчета
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д