我已经尝试在C中实现二进制搜索树几个小时了,我将主要问题缩小到插入功能,您将在下面看到。似乎问题在于,当我将root设置为null,然后尝试插入时,它会一遍又一遍地创建根节点但没有任何变化(我得到了#34;形成根节点消息"好几次,遍历不起作用)。但是,当我取消注释行//root = newNode(3,NULL,NULL);
并手动创建根节点时,我的所有插入工作正常,并且我的inorder遍历工作。我希望能够在我的函数中创建根节点,而不是像这样手动创建。这让我感到沮丧一段时间,所以任何帮助都会受到赞赏。谢谢!
#include <stdio.h>
#include <stdlib.h>
struct node {
int key;
struct node* left;
struct node* right;
};
struct node* newNode(int val, struct node* lchild, struct node* rchild) {
struct node* temp = malloc(sizeof(struct node));
if(temp == NULL) { printf("Error creating node! Exiting."); exit(1); }
temp->key = val;
temp->left = lchild;
temp->right = rchild;
return(temp);
}
void add(int val, struct node* current) {
if (current == NULL) {
printf("forming root node\n");
current = newNode(val,NULL,NULL);
} else if (val <= current->key) {
if (current->left == NULL) {
current->left = newNode(val, NULL, NULL);
} else {
add(val, current->left);
}
} else {
if (current->right == NULL) {
current->right = newNode(val, NULL, NULL);
} else {
add(val, current->right);
}
}
}
void inOrder(struct node* current) {
if (current != NULL) {
inOrder(current->left);
printf("%d ", current->key);
inOrder(current->right);
}
}
int main() {
struct node* root = NULL;
//root = newNode(3,NULL,NULL);
add(3, root);
add(2, root);
add(4, root);
add(16, root);
inOrder(root);
}
答案 0 :(得分:1)
C仅是按值传递。如果要从函数返回数据,则必须将指针传递给应修改的数据或将其返回。您的add()
- 函数目前都没有。
我的建议是,使用返回值 可能的更正原型:
struct node* add(int val, struct node* current)
void add(int val, struct node** current)
答案 1 :(得分:1)
这是因为您按值传递根节点的值。在main()中,您创建一个节点*(root)并将其设置为NULL。这意味着root包含一个0的内存地址。问题是没有返回任何值,因此无论你在add()中做什么,root的值仍为NULL或0.当你手动创建一个根节点时,它因为add()可以在给定的地址处修改内存,并且根点的值在某处有意义所以这些更改仍然存在,但是当root为null时,add()所做的所有更改都会丢失。
答案 2 :(得分:1)
您希望修改 current
指针,并将指针传递给它。
void add(int val, struct node **ptree);
{
if(*ptree == NULL) {
struct node *tmp = malloc(sizeof(*tmp));
tmp->val = val; tmp->left = tmp->right = NULL;
*ptree = tmp;
}
else if (val == (*ptree)->val)
/* Scream about duplicate insertion */
else if (val < (*ptree)->val)
add(val, &((*ptree)->left));
else /* val > (*ptree)->val */
add(val, &((*ptree)->right));
}
被称为例如add(42, &tree);
如果tree
是(将来)指向根的指针。