2016-12-13 24 views
-1

私はCバイナリ検索ツリーライブラリで作業していますが、ツリーサブツリーの右ノードを削除する関数を作成しようとしています。ここに私の木の構造体だ:バイナリ検索ツリー(C)の右サブツリーの右ノードを削除

struct Node { 
    int value; 
    struct Node *left; 
    struct Node *right; 
}; 

typedef struct Node TNode; 
typedef struct Node *binary_tree; 

ツリーが次のように作成されます。

binary_tree NewBinaryTree(int value_root) { 
    binary_tree newRoot = malloc(sizeof(TNode)); 
    if (newRoot) { 
     newRoot->value = value_root; 
     newRoot->left = NULL; 
     newRoot->right = NULL; 
    } 
    return newRoot; 
} 

それに要素を追加:

void Insert(binary_tree *tree, int val) { 
    if (*tree == NULL) { 
     *tree = (binary_tree)malloc(sizeof(TNode)); 
     (*tree)->value = val; 
     (*tree)->left = NULL; 
     (*tree)->right = NULL; 
    } else { 
     if (val < (*tree)->value) { 
      Insert(&(*tree)->left, val); 
     } else { 
      Insert(&(*tree)->right, val); 
     } 
    } 
} 

私は右のノードを削除するために書いた機能をサブツリーは次のようになります。

void delrightsubtree(binary_tree *tree){ 


     if((*tree)->value!=NULL) 

     { 
       free(&(*tree)->right); 
       delrightsubtree(&(*tree)->right); 
     } 
     else 
     { 
      printf("end"); 
     } 
    } 

しかし、この関数を呼び出すと(ツリーに複数の要素を追加した後に)クラッシュするので、この関数は機能していないようです。私は本当にこれを行う方法を知らない。

ありがとうございました!

+0

[Cバイナリツリーからノードを削除しないで削除する]可能な複製(http://stackoverflow.com/questions/41092850/delete-node-from-ac-binary-tree-without-messing-it- up) – Olaf

答えて

1

(挿入メソッドのように)再帰的な削除メソッドを実装したいと思うかもしれません。今のところ、単一のノード上でfreeと呼んでいるようですが、接続されているリソース(つまりその子ノード)は解放されません。代わりに、削除するツリーの部分をトラバースし、適切な値をNULLに設定することを検討してください。

+0

私は理解していません。私のインサートの方法を取って、あなたが意味するものを変えてもよろしいですか?ありがとうございました –

+0

あなたは 'Insert'を使って適切なアイデアを得ました。ノードを挿入するには、ツリーの最下部に達するまで子供に挿入するよう伝えます。 'Delete'と同じです:ブランチを削除するには、ツリーの一番下に達するまで子を削除するように子供に指示します。 – Zexus

+0

編集した機能で自分の投稿を編集しましたが、関数を呼び出すとコンパイルされましたがクラッシュしました –

0

最後に到達するまで(次の点はありません)、再帰的な削除メソッドを呼び出すだけで、必要なものをすべて解放し、nullに設定されていると思われるNULL値に設定できます。

関連する問題