删除分为两种可能:
1.只有左子树,或右子树,或叶结点。
q=p; p=p->left; free(q);
叶结点、只有右子树的情况相似。
2.有左子树和右子树的情况
先看完整代码:
int Delete(Tree &p) { Tree q,s; if(p->right==NULL)/*只有左子树*/ { q=p; p=p->left; free(q); } else if(p->left==NULL)/*只有右子树*/ { q=p; p=p->right; free(q); } else { q=p; s=p->left; while(s->right) { q=s; s=s->right; } p->data=s->data; if(q!=p) { q->right=s->left; } else q->left=s->left; free(s); } return TRUE; } int DeleteBSF(Tree &T,int key) { if(!T) return FALSE; else { if(key==T->data) return Delete(T); else if(key<T->data) return DeleteBSF(T->left,key); else return DeleteBSF(T->right,key); } }