所以我试图使用这个递归函数将值插入二叉树:
void add(node* *hd, int v){
node* curr = *hd;
if(curr == NULL){
curr = (node*)malloc(sizeof(node));
curr->value = v;
}else{
if(v < curr->value){
add(&curr->left, v);
}else{
add(&curr->right, v);
}
}
}
它似乎不起作用,我只是不明白为什么我不能做这样的事情。我该怎么办呢?
答案 0 :(得分:6)
您需要初始化指针,因为它们可能会设置为分配空间时获得的任何内容。现在当你通过add(&curr->left, v);
curr->left
时可能不是指针,但它仍然不是NULL
;
void add(node* *hd, int v){
node* curr = *hd;
if(curr == NULL){
curr = malloc(sizeof(node));
curr->left = curr->right = NULL;
curr->value = v;
*hd = curr; // from Mohamed KALLEL
}else{
if(v < curr->value){
add(&curr->left, v);
}else{
add(&curr->right, v);
}
}
}
答案 1 :(得分:5)
您的新节点未正确“连接”,因为您只是将指针存储在局部变量curr
中,而不是将其写入*hd
以更改调用者的指针。 / p>
答案 2 :(得分:2)
if(curr == NULL){
curr = malloc(sizeof(node));
curr->right = NULL;
curr->left = NULL; // From ks6g10 in order to initialize right and left to NULL
curr->value = v;
*hd = curr; // add this
}
BTW使用calloc
代替malloc
。它将节点内存初始化为0
答案 3 :(得分:1)
以递归方式添加二叉树的另一种方法可以这样做:
node *add(node *hd, int v)
{
node* curr = NULL;
if(!hd)
{
curr = malloc(sizeof(node));
curr->value = v;
curr->left = NULL;
curr->right = NULL;
return curr;
}else {
if(v < curr->value)
curr->left = add(curr->left,v);
else curr->right = add(curr->right,v);
}
return hd;
}
答案 4 :(得分:0)
您需要使用NULL初始化新形成的节点的左右指针,并让您的高清指向该节点。
void add(node* *hd, int v){
node* curr = *hd;
if(curr == NULL){
curr = malloc(sizeof(node));
curr->value = v;
curr->left=curr->right=NULL;
*hd = curr;
}else{
if(v < curr->value){
add(&curr->left, v);
}else{
add(&curr->right, v);
}
}
}
答案 5 :(得分:0)
我是这样做的:
void insert(int data, node *&cur)
{
if (cur == NULL)
{
cur = (struct node*) malloc(sizeof(struct node));
cur->data = data;
cur->left = NULL;
cur->right = NULL;
}
else
{
if (data > cur->data)
{
insert(data, cur->right);
}
else
{
insert(data, cur->left);
}
}
}