2017-04-21 113 views
1

我有問題刪除有兩個子樹的節點。當節點有左或右子樹時,我設法刪除節點,但當我嘗試刪除具有兩個子樹的節點時,我得到了分段錯誤。我需要一些幫助。我有一個函數來搜索並返回一個要刪除的節點,並且我有函數從子樹返回最小值。這兩個功能的工作原理刪除有兩個子樹/節點的節點

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函數從假設要刪除的節點的右子樹中找到最小值 –

回答

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; 
} 

注:而且你需要得到的*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