バイナリ検索ツリーから特定のキーを持つノードを削除するアルゴリズムの作業中です。親ポインタを持つバイナリ検索ツリーからノードを削除する
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <time.h>
typedef int ElType;
typedef struct Tree {
ElType key;
struct Tree *left;
struct Tree *right;
struct Tree *parent;
} Tree;
Tree* InsertBST(Tree* t, int k)
{
if (t == NULL) {
Tree* w = (Tree*) malloc(sizeof(Tree));
w->key = k;
w->left = NULL;
w->right = NULL;
w->parent = NULL;
return w;
}
if (k <= t->key) {
t->left = InsertBST(t->left, k);
t->left->parent = t;
}
else {
t->right = InsertBST(t->right, k);
t->right->parent = t;
}
return t;
}
Tree* DeleteMaxOfBST(Tree* t, ElType *deleted_value)
{
if (t == NULL) {
*deleted_value = -1;
return NULL;
}
if (t->right == NULL) {
*deleted_value = t->key;
Tree* w = t->left;
w->parent = t->parent;
free(t);
return w;
}
t->right = DeleteMaxOfBST(t->right, deleted_value);
return t;
}
Tree* DeleteNodeOfBST(Tree* t, int k)
{
if (t == NULL) return NULL;
if (k < t->key) {
t->left = DeleteNodeOfBST(t->left, k);
return t;
}
else if (k > t->key) {
t->right = DeleteNodeOfBST(t->right, k);
return t;
}
else if (t->left == NULL) {
Tree* w = t->right;
w->parent = t->parent;
free(t);
return w;
}
else {
ElType max_left;
t->left = DeleteMaxOfBST(t->left, &max_left);
t->key = max_left;
return t;
}
}
一般的な考え方は、私が親ノードへのポインタとBSTと協力し、いずれかのキーIを持つノードを削除できるようにしたいということです。これまでのところ、私は次のコードを思い付くことができましたBSTの構造を保存しながら指定します。
私のコードはいくつかのツリーのいくつかのキーで動作しますが、見た目のパターンがない他のキーではクラッシュします。私は、次のエラーを取得する:
Segmentation fault (core dumped)
私は親ノードへのポインタを台無しにしているが、障害がどこにあるかかなり正確に特定することはできません考えるために傾斜しています。私はC言語には比較的新しいので、ポインタが実際にここの問題になっているかどうか、そしておそらくこれを修正する方法についてのコメントは感謝しています。ここで
デバッガでコードを実行する場合は、segfaultを担当するコードを特定し、そのコードを担当するデータを調べる必要があります。おそらくこの問題は以前に発生したデータ破損によって発生する可能性がありますが、それは少なくともあなたに何かを見せることになります。 –
私たちがそれを見たいのであれば、一般に[mcve]を見たいと思っています。この場合、少なくともエラーの再現を可能にする一連の挿入と削除が含まれています。 –
ツリーに1つのノードしか追加されていないとし、 'DeleteNodeOfBST()'が一致するキーで呼び出されたとします。 'Tree * w = t-> right;' - > 'w'は' NULL'で、 'w-> parent'はUBです。 – chux