2分探索木の節点の削除

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Ikun
記事: 2
登録日時: 7年前

2分探索木の節点の削除

#1

投稿記事 by Ikun » 7年前

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;
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 2分探索木の節点の削除

#2

投稿記事 by みけCAT » 7年前

まず、ソースコードをcodeタグで囲まずに貼っているのが間違い(フォーラムルール違反)です。
次に、「節点が子を二つ持つ場合」の処理がおかしいようで、閉路ができたり参照されなくなるノードができたりしそうです。
(実行せずコードを読んで予想しただけなので、間違っていたらごめんなさい)
nss-20171224.png
削除結果
nss-20171224.png (4.17 KiB) 閲覧数: 2274 回
searchMin関数内でp = p->right;した結果を利用していないのも怪しい(code smell)ですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Ikun
記事: 2
登録日時: 7年前

Re: 2分探索木の節点の削除

#3

投稿記事 by Ikun » 7年前

すみません。フォーラムルールを把握できていませんでした。以後気を付けます。
やり方を
⓵消す節点のデータをその右部分木の最小値のデータに書き換える。
⓶右部分木の最小値のデータを持つ節点を削除する。
という風にやるとできました。
ありがとうございました。

返信

“C言語何でも質問掲示板” へ戻る