それを行うためのきちんとした方法は、再帰を使用することです。削除関数に、現在のノードへの参照を呼び出し元の関数に返すように依頼します。そうすれば、親ノードを簡単に変更できます。
参照用の再帰コードを次に示します。
構造宣言:
typedef struct node {
int info;
struct node* lchild;
struct node* rchild;
}NODE;
削除のコード:
NODE* deleteElem(NODE* root, int elem) {
NODE* save;
if(root == NULL) {
printf("Element not in the tree !\n");
return;
}
if(root->info == elem) {
if(root->rchild == NULL && root->lchild == NULL) { // no child
free(root);
return NULL;
}
else if(root->rchild == NULL || root->lchild == NULL) { // one child
if(root->rchild == NULL) {
save = root->lchild;
free(root);
return save;
}
else {
save = root->rchild;
free(root);
return save;
}
}
else { // two children
save = findPred(root->lchild);
root->info = save->info;
root->lchild = deleteElem(root->lchild, root->info);
return root;
}
}
else if(root->info < elem) {
root->rchild = deleteElem(root->rchild, elem);
}
else if(root->info > elem) {
root->lchild = deleteElem(root->lchild, elem);
}
return root;
}
NODE* findPred(NODE* root) {
static NODE* pred;
if(root == NULL) {
return pred;
}
else {
pred = root;
return findPred(root->rchild);
}
}
PS : 申し訳ありませんが、関数のプロトタイプ宣言に気付きました。プロトタイプの宣言に合わせてこのコードを変更するのがそれほど難しくないことを願っています。