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