2017-04-21 8 views
1

2つのサブツリーを持つノードを削除する際に問題があります。私はノードが左または右のサブツリーを持っているときにノードを削除することができましたが、私は2つのサブツリーを持つノードを削除しようとしたときにセグメンテーションフォールトを取得しました。助けが必要です。私は、削除するノードを検索して返す関数を持っていて、サブツリーから関数の戻り値の最小値を持っています。どちらの関数も2つのサブツリー/ノードを持つノードを削除する

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

どうすればelseのツリーの右側をチェックするだけですか – Archmede

+0

はい、私はダブル・ピンターを使用しています。 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; 
} 

N.B.また、あなたが「7」を削除し、「8」されている以下の例では

をNULLに(旧*min*minの古い親を取得し、その左の子を配置する必要がありますが分要素です。 あなたは"9"->left = NULL;

enter image description here

+0

"* minを意味し、その左の子(古い*分)をNULLにします" –

+0

@DanielNillesは画像を見ます。あなたは新しいルートとして「8」を入れています.. "9" - > leftはNULLにする必要があります。 – granmirupa

+0

@DanielNillesうまくいけば解決しました。答えは – granmirupa

関連する問題