递归二叉树插入

时间:2012-11-28 14:48:05

标签: c recursion tree binary-tree insertion

所以我试图使用这个递归函数将值插入二叉树:

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);
    }
}
}

它似乎不起作用,我只是不明白为什么我不能做这样的事情。我该怎么办呢?

6 个答案:

答案 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>

另外,don't cast the return value of malloc() in C

答案 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);
        }
    }
}