删除具有两个子树/节点的节点

时间:2017-04-21 16:05:24

标签: c

我在删除具有两个子树的节点时遇到问题。当节点有左或右子树时,我设法删除了节点,但是当我试图删除有两个子树的节点时,我得到了分段错误。我需要一些帮助。我有一个函数来搜索并返回一个要删除的节点,并且我有函数从子树返回最小值。这两个功能都有效

bool tree_delete(tree_t *t, void *key){

 node_t **find = findNode(t, key); 

  if(*find != NULL){

    if((*find) -> left == NULL && (*find) -> right == NULL){
      free(*find);
      return true; 
      }
    else if ((*find) -> left != NULL && (*find) -> right == NULL){
      node_t *temp = *find; 
      *find = (*find) -> left ; 
      free(temp); 
      return true; 


    }
    else if ((*find)-> left == NULL && (*find) -> right !=NULL){
      node_t *temp = *find; 
      *find = (*find) -> right;
      free(temp); 
      return true; 
    }
    else{

      // problem in this part of the code
      node_t **min  = find_min(&(*find) -> right);
      *find = *min; 
      free(*min);
      return true; 

    }
  }
}

我已经像这样更新了我的代码,但仍然遇到了段错误 -

 node_t *temp = *find;
  node_t **min  = find_min(&(*find)-> right); 
  (*min) ->right = (*find)->right;
  (*min) ->left = (*find)->left;
  *find = *min;
  free(temp);
  node_t **min2 = find_min(&(*find) -> right); 
  free(*min2); 
  *min2 = NULL; 
  return true; 

1 个答案:

答案 0 :(得分:0)

这里我假设树已排序,*min是叶节点。

这应该是正确的:

else{
  node_t *temp = *find;
  node_t **min  = find_min(&(*find) -> right); 
  (*min) ->right = (*find) ->right;
  (*min) ->left = (*find) ->left;
  *find = *min;
  free(temp);
  // some more operation --> read below
  return true; 
}

N.B。此外,您需要获取*min的旧父,并将其左子(旧*min)设为NULL

在下面的示例中,您将删除“7”,“8”是min元素。 您需要放置"9"->left = NULL;

enter image description here