我是 c 的新手,但对于一个项目,我正在实现一个二叉树。这是我的函数代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct BSTnode{
int key;
int subtree_size;
struct BSTnode* left;
struct BSTnode* right;
} TreeNode;
TreeNode* newNode(int value){
TreeNode *node = malloc(sizeof(TreeNode));
node->key = value;
node->left = NULL;
node->right = NULL;
node->subtree_size = 1;
return node;
}
TreeNode* insert(TreeNode* root, TreeNode* to_insert){
if(root == NULL){
root = newNode(to_insert->key);
}
else if(to_insert->key> root->key){
if(root->right == NULL){
root->right = to_insert;
return root;
}
else{
root->right = insert(root->right, to_insert);
}
}
else if(to_insert->key< root->key){
if(root->left == NULL){
root->left = to_insert;
return root;
}
root->left = insert(root->left, to_insert);
}
root->subtree_size = 1 + (root->left? root->left->subtree_size: 0) + (root->right? root->right->subtree_size: 0);
return root;
}
int find(TreeNode* root, int value){
if(root == NULL || root->key == value){
return root->key;
}
else if(value > root->key){
return find(root->right, value);
}
else{
return find(root->left, value);
}
}
在我的主函数中,我正在读取一个文件,该文件的每一行都包含一个数字,我必须将其插入到 BST 中。每行以一个字母开头,后跟由空格分隔的数字。
int main (int argc, char* argv[]){
FILE* input;
input = fopen(argv[1], "r");
char oper;
int num;
TreeNode* root = NULL;
while(fscanf(input, "%c", &oper) != EOF){
if(oper == 'i'){
fscanf(input, " %d\n", &num);
TreeNode* to_insert = newNode(num);
insert(root, to_insert);
//printf("operation: %c, num: %d\n", oper, num);
}
if(oper == 'r'){
//do some other thing
}
}
if(root == NULL){
printf("yes\n");
}
printf("size: %d\n", root->subtree_size);
printf("left size: %d\n", root->left->subtree_size);
printf("right size: %d\n", root->right->subtree_size);
fclose(input);
}
运行代码会打印“yes”,然后它给我一个段错误。我看过另一篇关于类似问题的文章,解决方案是更改插入函数以接受根的双指针。这在这里有用吗?如果是的话,它会是什么样子?我不太擅长使用双指针。
编辑1:假设
fscanf()
和输入文件已正确使用和打开。
Edit2:输入文件将如下所示:
i 10
i 20
i 30
i 40
i 50
i 60
i 70
i 80
i 90
i 99
i 15
i 14
i 12
i 25
i 28
i 95
i 35
i 38
i 11
i 23
i 22
您的
insert()
函数返回 root
。但你永远不会将返回值分配给任何东西。
您的
main()
:
TreeNode* root = NULL;
while(fscanf(input, "%c", &oper) != EOF){
// ...
insert(root, to_insert);
您的
root
始终保持 NULL
。