【问题标题】:Recursive Binary tree insertion递归二叉树插入
【发布时间】:2012-11-16 11:10:24
【问题描述】:

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

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

它似乎不起作用,我只是不明白为什么我不能做这样的事情。我将如何解决它?

【问题讨论】:

    标签: c recursion tree binary-tree insertion


    【解决方案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;
    }
    

    【讨论】:

      【解决方案2】:

      我是这样做的:

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

      【讨论】:

        【解决方案3】:

        您需要初始化指针,因为它们可能会被设置为分配空间时获得的任何值。现在当你通过add(&amp;curr-&gt;left, v);curr-&gt;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);
                }
            }
        }
        

        【讨论】:

        • 没错。您的回答错过了将新节点 curr 链接到树的事实
        • 谢谢,我明白了!我认为它应该是 *hd = curr;尽管。但否则是的,这是正确的。
        • 不需要加return;来停止递归吗?
        • 不,因为我们正在寻找一个要插入的空节点,因此当我们到达 if(curr == NULL) 时,我们将分配内存,设置指针,然后递归停止(到达函数的末尾),因为它不再调用 add(),因为它是另一个没有被占用的分支。
        【解决方案4】:
        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
        }
        

        顺便说一句,使用calloc 而不是malloc。它将你的节点内存初始化为0

        【讨论】:

        • 使用calloc()没有任何意义;它适用的唯一内容(整数)会立即被覆盖。请注意,不能依赖calloc() 正确设置指向NULL 的指针。
        • 是的,你是对的。在某些平台上,NULL 不是 0。谢谢。答案已更新
        【解决方案5】:

        你需要用NULL初始化你新形成的节点的左右指针,并让你的hd指向那个节点。

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

        【讨论】:

          【解决方案6】:

          您的新节点未正确“连接”,因为您只是将指针存储在局部变量 curr 中,而不是将其写入 *hd 以更改调用者的指针。

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

          【讨论】:

            猜你喜欢
            • 2020-07-24
            • 2014-12-03
            • 1970-01-01
            • 1970-01-01
            • 2015-09-19
            • 2011-12-15
            • 1970-01-01
            相关资源
            最近更新 更多