Найти количество листьев в дереве - 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; — возвращаем результат подсчета