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

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

问题描述:

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

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

你为什么有双指针('node_t ** find'),用于间接引用('(*查找)')? – CristiFati

+0

你怎么只检查其他 – Archmede

+0

树的右侧是的,我正在使用双pinter。 find_min函数从假设要删除的节点的右子树中找到最小值 –

在这里,我假设树排序,并*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;

enter image description here

+0

你是什么意思“* min并将其左边的孩子(旧的* min)设置为NULL” –

+0

@DanielNilles看图片..你把“8”作为新的根..所以“9” - >左边需要为NULL – granmirupa

+0

@DanielNilles如果它的工作请设置答案为解决 – granmirupa