gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:23:55 24 4
gpt4 key购买 nike

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

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;

最佳答案

这里我假设树已排序并且 *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”是最小元素。您需要输入 "9"->left = NULL;

enter image description here

关于c - 删除具有两个子树/节点的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43547289/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com