【问题标题】:Having trouble with a binary search tree remove function二叉搜索树删除功能有问题
【发布时间】:2016-04-13 08:08:18
【问题描述】:

我正在尝试从二叉搜索树中删除给定值。如果给定值存在,该函数返回 1,否则返回 0。我认为我没有正确返回值。正确的值似乎被删除了,但是我在不应该的时候打印了一条删除消息,表明该函数在不应该的时候返回 0。谁能帮我发现我的错误?谢谢。

/*Remove data from BST pointed to by rootRef, changing root if necessary.
* For simplicity's sake, always choose node's in-order
* successor in the two-child case.
* Memory for removed node should be freed.
* Return 1 if data was present, 0 if not found. */

int removeBST(struct TreeNode** rootRef, int data)
{  
  struct TreeNode* heir;
  struct TreeNode* prev;

  if(*rootRef == NULL)
  {
    return 0;
  }

  if(data < (*rootRef)->data)
  {
    removeBST(&(*rootRef)->left, data);
  }
  else if(data > (*rootRef)->data)
  {
    removeBST(&(*rootRef)->right, data);
  }
  else
  {
    struct TreeNode* temp;

    if((*rootRef)->right == NULL)
    {
      temp = *rootRef;
      *rootRef = (*rootRef)->left;
      free(temp);
    }
    else if((*rootRef)->left == NULL)
    {
      temp = *rootRef;
      *rootRef = (*rootRef)->right; 
      free(temp);
    }
    else
    {
      heir = (*rootRef)->left;
      prev = *rootRef;

      while(heir->right != NULL)
      {
        prev = heir;
        heir = heir->right;
      } 

      (*rootRef)->data = heir->data;

      if(prev != *rootRef)
      {
        prev->right = heir->left;
      }
      else
      {
         prev->left = heir->left;
      }
      free(heir);
   }
   return 1;
  }
  return 0;
}

【问题讨论】:

    标签: c binary-search-tree


    【解决方案1】:

    当它递归调用自身时,需要返回递归调用的值。所以改变:

    removeBST(&(*rootRef)->left, data);
    

    到:

    return removeBST(&(*rootRef)->left, data);
    

    同样适用于右手的情况。没有这个,对于这些情况,它只是失败并返回 0。

    【讨论】:

      【解决方案2】:

      替换

      if(data < (*rootRef)->data)
      {
        removeBST(&(*rootRef)->left, data);
      }
      else if(data > (*rootRef)->data)
      {
        removeBST(&(*rootRef)->right, data);
      }
      

      if(data < (*rootRef)->data)
      {
        return removeBST(&(*rootRef)->left, data);
      }
      else if(data > (*rootRef)->data)
      {
        return removeBST(&(*rootRef)->right, data);
      }
      

      调用函数时,没有使用返回值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-28
        • 1970-01-01
        相关资源
        最近更新 更多