2つ子を持つ節点の節点の削除のC言語での実現方法が分かりません。
以下のコードで削除を行うと、削除はできるのですが、別の関数で、節点を表示するときにエラーが起きてしまいます。
どこが間違っているか教えていただけるとありがたいです。
よろしくお願いします。
person* deleteNode(person* p, char name[]) {
person* x;
if (p == NULL) {
printf("見つかりませんでした。\n");
return NULL;
}
else if (strcmp(name, p->name) > 0) {
p->right = deleteNode(p->right, name);
return p;
}
else if (strcmp(name, p->name) < 0) {
p->left = deleteNode(p->left, name);
return p;
}
else {
if (p->left == NULL && p->right == NULL) { // 節点が子を持たない場合
free(p);
printf("削除されました。\n");
return NULL;
}
else if (p->left == NULL) { // 節点が左に子を持たない場合
x = p->right;
}
else if (p->right == NULL) { // 節点が右に子を持たない場合
x = p->left;
}
else { // 節点が子を二つ持つ場合
x = searchMin(p->right);
x->left = p->left;
x->right = p->right;
}
free(p);
printf("削除されました。\n");
return x;
}
}
person* searchMin(person* p) {
person* x;
while (p->left != NULL) {
p = p->left;
}
x = p;
p = p->right;
return x;
}
2分探索木の節点の削除
Re: 2分探索木の節点の削除
まず、ソースコードをcodeタグで囲まずに貼っているのが間違い(フォーラムルール違反)です。
次に、「節点が子を二つ持つ場合」の処理がおかしいようで、閉路ができたり参照されなくなるノードができたりしそうです。
(実行せずコードを読んで予想しただけなので、間違っていたらごめんなさい) searchMin関数内でp = p->right;した結果を利用していないのも怪しい(code smell)ですね。
次に、「節点が子を二つ持つ場合」の処理がおかしいようで、閉路ができたり参照されなくなるノードができたりしそうです。
(実行せずコードを読んで予想しただけなので、間違っていたらごめんなさい) searchMin関数内でp = p->right;した結果を利用していないのも怪しい(code smell)ですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 2分探索木の節点の削除
すみません。フォーラムルールを把握できていませんでした。以後気を付けます。
やり方を
⓵消す節点のデータをその右部分木の最小値のデータに書き換える。
⓶右部分木の最小値のデータを持つ節点を削除する。
という風にやるとできました。
ありがとうございました。
やり方を
⓵消す節点のデータをその右部分木の最小値のデータに書き換える。
⓶右部分木の最小値のデータを持つ節点を削除する。
という風にやるとできました。
ありがとうございました。