先给出正确代码:
//删除指定结点值为x的为根的子树 void delXsub(BiTree T,BiTree *p,char x){ //p 存储的是指向该指针的地址 if(T){ if(T->data==x){ del(T); *p=NULL;//如果直接令T=NULL,是错的 } else{ delXsub(T->left,&T->left,x); delXsub(T->right,&T->right,x); } } }
//释放 void del(BiTree T){ if(T){ del(T->left); del(T->right); free(T); } }
错误代码:
void delXsub(BiTree T,char x){ //p 存储的是指向该指针的地址 if(T){ if(T->data==x){ del(T); T=NULL; } else{ delXsub(T->left,x); delXsub(T->right,x); } } }
分析原因:

如图:真正要实现的是把p这个指针置为空,但是遍历时每一个T指针实际上是个形参也就是说T实际上是p的一个复制品,改变T并不能去改变p,所有在正确的代码上,我用一个二重指针存储了p的地址,通过地址来操作p,这个问题就可以解决了