我几乎让我的代码工作,但由于某种原因,它实际上并没有采用每个节点的值并将它们添加起来。相反,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;
}
答案 0 :(得分:1)
您的代码中存在两个问题。
root
的初始调用未设置btreeInsert
。因此btreeInsert(root, value);
应为root = btreeInsert(root, value);
malloc调用使用的是不正确的大小:
temp = (struct node *)malloc(sizeof(node));
混淆来自于这样一个事实,即名为node
的类型和名为node
的变量。在该行中,变量在范围内。变量是一个指针,因此sizeof(node)
给出指针大小。但是你显然希望结构大小不是指针大小。通过不重载类型和变量名称,建议您将来避免这种混淆。解决这个问题的一种方法是将该行更改为以下内容(不需要强制转换BTW):
temp = malloc(sizeof(*temp));