Найти количество листьев в дереве - 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) в дереве.

  1. Если переданный ей указатель на узел root равен NULL, то это означает, что дерево пустое, и она возвращает 0.
  2. Если узел root имеет только один лист, то возвращает 1.
  3. В противном случае, рекурсивно вызывает саму себя для левого и правого поддеревьев от узла root, и возвращает их суммы. Таким образом, данный код вычисляет количество листьев в дереве, начиная с его вершины и последовательно перебирая все узлы. Список переменных и их значений:
  4. int list_count(tree *root) — объявление функции list_count
  5. int result — результат работы функции
  6. tree *root — указатель на узел дерева, с которого начинается подсчет
  7. if (root==NULL) — проверка, является ли корневой узел пустым
  8. { result = 0; } — если дерево пустое, то возвращаем 0
  9. else if ((root->left==NULL)&&(root->right==NULL)) — проверка, является ли узел листом
  10. { result = 1; } — если узел является листом, то возвращаем 1
  11. else — если узел не является листом
  12. { result = list_count(root->left) + list_count(root->right); } — рекурсивный вызов функции для левого и правого поддеревьев
  13. return result; — возвращаем результат подсчета

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

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