打印二进制搜索树范围内的和

时间:2016-03-07 03:53:56

标签: c binary-search-tree

我几乎让我的代码工作,但由于某种原因,它实际上并没有采用每个节点的值并将它们添加起来。相反,sum的输出每次都是0。我认为btreeSumRange方法中的sum = sum +数据行会处理这个问题。知道如何解决这个问题吗?

  #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 个答案:

答案 0 :(得分:1)

您的代码中存在两个问题。

  1. 在顶层,root的初始调用未设置btreeInsert。因此btreeInsert(root, value);应为root = btreeInsert(root, value);
  2. malloc调用使用的是不正确的大小:

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

    混淆来自于这样一个事实,即名为node类型和名为node变量。在该行中,变量在范围内。变量是一个指针,因此sizeof(node)给出指针大小。但是你显然希望结构大小不是指针大小。通过不重载类型和变量名称,建议您将来避免这种混淆。解决这个问题的一种方法是将该行更改为以下内容(不需要强制转换BTW):

    temp = malloc(sizeof(*temp));