我是新来的,但对于一个项目,我正在执行一棵二进制树。 这是我的函数代码:
#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);
}
}
在我的主要函数中,我读取的文件是,我必须在每一行中插入一个数字,每个行以字母开头,然后是空格分隔的编号。
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
", &num);
TreeNode* to_insert = newNode(num);
insert(root, to_insert);
//printf("operation: %c, num: %d
", oper, num);
}
if(oper == r ){
//do some other thing
}
}
if(root == NULL){
printf("yes
");
}
printf("size: %d
", root->subtree_size);
printf("left size: %d
", root->left->subtree_size);
printf("right size: %d
", root->right->subtree_size);
fclose(input);
}
运行代码打印“ 是 ”, 这给了我一个分类错误。 我看到了另一个关于类似问题的文章, 解决办法是将插入功能更改为根的双指针。 这有用吗? Id so? 会是什么样子呢? 我对双指针不太行 。
编辑 1: 假设 < code> fscanf () 和输入文件得到正确使用和打开 。
编辑2: 输入文件将看起来像这样 :
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