2011-03-30 11 views
0

私はバイナリ検索ツリーをコーディングしています。ノードを効果的に削除する方法を見つけるのに少し問題があります。空き(N)を使用してBSTでノードを削除する

私はこのコードを持っている:

struct node* deleteNode(int i, struct node *N) 

{ 
    if (N==NULL) 
    { 
     return NULL; 
    } 
    else if (i<N->value) 
    { 
     N->size--; 
     N->lChild=deleteNode(i,N->lChild); 
    } 
    else if (i>N->value) 
    { 
     N->size--; 
     N->rChild=deleteNode(i,N->rChild); 
    } 
    else if (N->lChild==NULL) 
    { 
     return N->rChild; 
    } 
    else if (N->rChild==NULL) 
    { 
     return N->lChild; 
    } 
    else 
    { 
     N->size--; 
     N->value=findMin(N->rChild); 
     N->rChild=deleteNode(N->value,N->rChild); 
    } 
    return N; 
} 

およびNは、5つのフィールド有するノード構造である:値、lChild、rChild、サイズ、高さ。私はここでやって実際に は、木は私が削除したいノードに向かって指すようにないようにすることですが、私のような何か入れしようとしているとき:それは、

else if (N->rChild==NULL) 
    { 
     free(N); 
     N=NULL; 
     return N->lChild; 
    } 

またはすべての同様の探したコードを動作しません。誰かが正しい方向に私を向けることができますか? ありがとうございます。

答えて

0

まずN = NULLと言って、N> lchild Nを呼び出すとnullになり、何も指さないので、どのようにlchild値を取得すると思いますか?

これは宿題なので、私は直接の回答はしませんが、ヒントはあります。

ノードを削除するには、ノードが削除されていないかどうかを確認し、ノードが解放されていなければ親ノードのptrなどの参照を削除します。 子スワップが1つの場合は、子ノードで削除するノードを指すptrを削除し、ノードを解放します。また、2人の子供がいる場合も同様です。

+0

このようなものにコメントを追加する –

+0

私は残りの部分で編集するつもりでした.... –

+0

ええ、これは悪い例でしたが、N = NULLを入れない場合でもうまくいきました。起動すると、プログラムがクラッシュします。 (だから無料(N)だけで、明らかに彼はNを解放してからN>を使って私を気に入らない)、問題はどこに置くべきかわからないということです。 – Sword22

関連する問題