一个巧妙的方法是使用递归。您要求删除函数将对当前节点的引用返回给调用函数。这样您就可以轻松地修改父节点。
以下是一些递归代码供您参考:
结构声明:
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:抱歉,我刚刚注意到您的函数的原型声明。我希望更改此代码以匹配您的原型声明应该不会太困难。