删除有两个子树/节点的节点
我有问题删除有两个子树的节点。当节点有左或右子树时,我设法删除节点,但当我尝试删除具有两个子树的节点时,我得到了分段错误。我需要一些帮助。我有一个函数来搜索并返回一个要删除的节点,并且我有函数从子树返回最小值。这两个功能的工作原理删除有两个子树/节点的节点
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;
}
注:而且你需要得到的*min
老父母,并把它的左子(老*min
)为NULL
在下面的例子中,你删除的“7”和“8”是最小元素。 你需要把"9"->left = NULL;
你是什么意思“* min并将其左边的孩子(旧的* min)设置为NULL” –
@DanielNilles看图片..你把“8”作为新的根..所以“9” - >左边需要为NULL – granmirupa
@DanielNilles如果它的工作请设置答案为解决 – granmirupa
你为什么有双指针('node_t ** find'),用于间接引用('(*查找)')? – CristiFati
你怎么只检查其他 – Archmede
树的右侧是的,我正在使用双pinter。 find_min函数从假设要删除的节点的右子树中找到最小值 –