删除操作的步骤
- 如果要删除的节点A的左节点为空则把右节点B往上移一位 然后删除节点A
- 同理右子树为空,左子树上移
- 需删除节点T的左右子树均存在的情况
- 先循环T->rchild->lchild,找到被删节点的rchild的最left的节点B。
- 将节点B和节点T互换值。
- 判断节点B是不是T->rchild,如果是则说明T的右子树就B一节点,将T的右子树设置为null,最后删除T。
- 如果节点B不是T->rchild说明右子树下还有树,B只是个T->rchild->lchild的末尾叶子节点。则找到B的父节点,将B父节点的lchild设置为null,最后删除T。
bool DeleElement(BiTree &T, int key)
{
if(!T)
{
return 0;
}
if(T->data == key)
{
BitNode *s, *p;
if(T->rchild == NULL)
{
s = T;
T = T->lchild;
free(s);
}
else if (T->lchild == NULL)
{
s = T;
T = T->rchild;
free(s);
}
else
{
p = T;
s = T->rchild;
while(s->lchild)//find the min in T->rchild->lchild till it comes to null
{
p = s;
s = s->lchild;
}
T->data = s->data;
if(p != T)
{
p->lchild = NULL;
}else{
p->rchild = NULL;
}
free(s);
}
return 1;
}
else if(key < T->data)
DeleElement(T->lchild, key);
else
DeleElement(T->rchild, key);
}