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