2016-03-07 2 views
0

У меня почти работает мой код, но по какой-то причине он фактически не принимает значения каждого узла и не добавляет их. Вместо этого вывод для суммы равен 0 каждый раз. Я думал, что линия sum = sum + data в методе btreeSumRange позаботится об этом. Любая идея, как это исправить?Печать Суммы в пределах диапазона для двоичного дерева поиска

#include <stdio.h> 
    #include <stdlib.h> 

    static long long sum; 

    typedef struct node 
    { 
     long long data; 
     struct node *left; 
     struct node *right; 
    } node; 


node * btreeInsert(node *node,long long data) 
{ 
    if(node==NULL) 
    { 
     struct node *temp; 
     temp = (struct node *)malloc(sizeof(node)); 
     temp -> data = data; 
     temp -> left = temp -> right = NULL; 
     return temp; 
    } 

    if(data >(node->data)) 
    { 
     node->right = btreeInsert(node->right,data); 
    } 
    else if(data < (node->data)) 
    { 
     node->left = btreeInsert(node->left,data); 
    } 
    return node; 

} 

void btreeSumRange(node *tree, long long min,long long max) { 
    if (tree == NULL) { 
     return; 
    } 
    btreeSumRange(tree->left, min, max); 
    long long data= tree->data; 

    if((data>=min)&&(data<=max)){ 
     sum = sum + data; 
    } 
    btreeSumRange(tree->right, min, max); 
} 


int main() { 

    node *root; 
    long long value; 
    root = NULL; 

    FILE* data = fopen ("dataA", "r"); 
    FILE* range = fopen ("rangeA", "r"); 

    while(fscanf(data, "%lld\n", &value) != EOF){ 
     printf("%lld\n", value); 
     btreeInsert(root, value); 
    } 

    long long min; 
    long long max; 

    while(fscanf(range, "%lld %lld\n", &min, &max) != EOF){ 
     btreeSumRange(root, min, max); 
     printf("Range [%lld,%lld]. Sum = %lld. \n", min, max, sum); 
    } 


    return 0; 
} 

ответ

1

У вас есть две проблемы в вашем коде.

  1. На верхнем уровне root не установлен для первоначального вызова btreeInsert. Так btreeInsert(root, value); должен быть root = btreeInsert(root, value);
  2. Вызов таНоса использует неправильный размер:

    temp = (struct node *)malloc(sizeof(node));

    Путаница происходит из-за того, что существует как типа имени node и переменная имени node , И в этой строке находится переменная , которая находится в области. Переменная - указатель, поэтому sizeof(node) дает размер указателя. Но вы явно хотите, чтобы размер структуры не был размером указателя. Предложите избегать такой путаницы в будущем, не перегружая типы и имена переменных. Один из способов исправить это было бы изменить эту линию к следующему (без броска необходимого КСТАТИ):

    temp = malloc(sizeof(*temp));