//从T节点开始删除,parent为T的父节点,key为要删除的节点的关键字值
//返回删除后T位置的新指针
BiNode* DelNode(BiNode* T, BiNode* parent, int key)
{
BiNode* s; BiNode* p;
BiNode* rp = NULL;
if(key < T->data)
{
if(NULL != T->lchild)
T->lchild = DelNode(T->lchild, T, key);
return T;
}
if(key > T->data)
{
if(NULL != T->rchild)
T->rchild = DelNode(T->rchild, T, key);
return T;
}
if(T->data == key)
{
if(NULL==T->lchild && NULL==T->rchild) //叶子节点
{
if(NULL != parent)
{
if(parent->lchild == T)
{
parent->lchild = NULL;
}
else
{
parent->rchild = NULL;
}
}
free(T); return NULL;
}
if(NULL == T->lchild) //左子树为空
{
if(NULL != parent)
{
if(parent->lchild == T)
{
parent->lchild = T->rchild;
}
else
{
parent->rchild = T->rchild;
}
}
rp = T->rchild;
free(T);
return rp;
}
if(NULL == T->rchild) //右子树为空
{
if(NULL != parent)
{
if(parent->lchild == T)
{
parent->lchild = T->lchild;
}
else
{
parent->rchild = T->lchild;
}
}
rp = T->lchild;
free(T);
return rp;
}
//左右子树均不为空
p = T;
s = T->lchild;
while(s->rchild)
{
p = s;
s = s->rchild;
}
T->data = s->data;
if(p != T)
{
p->rchild = s->lchild;
}
else
{
T->lchild = s->lchild;
}
free(s);
return T;
}
return T;
}
//在二叉排序树中删除一个等于某值的节点//returnt the new root
BiNode* DelNodeInBiSortTree(BiNode* T, int key)
{
if(NULL == T)
return NULL;
if(key == T->data)
{
T = DelNode(T,NULL,key); return T;
}
if(key < T->data && T->lchild)
{
T->lchild = DelNode(T->lchild,T,key);
return T;
}
if(key > T->data && T->rchild)
{
T->rchild = DelNode(T->rchild,T,key);
}
return T;
}