赤黒の木のコードをオンラインで見つけたので、それを実装しようとしています。
assert
元のコードがここに配置されている関数を使用したくない
n->color = child->color;
削除修正の直前に回線でセグ フォールトが発生しています。デバッグ後、このケースでは子が存在しないことがわかりました。そのため、元のコードに assert ステートメントが含まれている理由がわかりました。子が処理される場所から下に向かってすべての if 句を追加して、適切だと思うものを追加することにしました。
ただし、子が存在しない場合はループに入らないため、プログラムは実際には削除しません。試行錯誤の末、assert ステートメントを適切に置き換えるために if 句を閉じる場所をまだ見つけることができません。
あなたのアイデアを教えてください!
これは、アサートなしの「翻訳された」コードで、代わりに if ステートメントを使用しています。
void delete_node(int key)
{
node* child;
node* n ;
n = searchTree(key);
if(n == NULL)return;
if(n->left != NULL && n->right != NULL)
{
node* pred = n->left;
while(pred->right != NULL)
pred = pred->right;
n->value = pred->value;
n = pred;
}
if(n->right != NULL || n->left != NULL){
child = n->right == NULL ? n->left : n->right;
if(n->color == 'b')
{
n->color = child->color;
delete_fix1(n);
}
swap_nodes(n, child);
if(n->parent == NULL && child != NULL)
child->color = 'b';
free(n);
}
}
テスト データ (削除しようとすると Seg Fault が発生する 4): i は挿入を表します (私が知る限り、挿入は問題なく行われます) d は削除を表します
i 7
i 8
i 1
d 8
i 4
i 10
d 4
i 11