删除结点的三种情况:
1.叶子结点
2.仅有左或右子树的结点
3.左右子树都有结点
typedef struct BiTNode{
int data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
Status DeleteBST(BiTree* T,int key)
{
if (!*T)
return false;
else
{
if (key == (*T)->data)
return Delete1(T);
else if (key < (*T)->data)
return DeleteBST(&(*T)->lchild, key);
else
return DeleteBST(&(*T)->rchild, key);
}
}
Status Delete1(BiTree *p)
{
BiTree q, s;
if ((*p)->rchild == NULL)
{
q = *p; *p = (*p)->lchild; free(q);
}
else if ((*p)->lchild == NULL)
{
q = *p; *p = (*p)->rchild; free(q);
}
else
{
q = *p;
s = (*p)->lchild;
while(s->rchild)
{
q = s;
s = s->rchild;
}
(*p)->data = s->data;
if (q != *p)
q->rchild = s->lchild;
else
q->lchild = s->lchild;
free(s);
}
}