64,642
社区成员
发帖
与我相关
我的任务
分享
/*
若在平衡的二叉排序树t中存在和e有相同关键字的结点,则删除之
并返回true,否则返回false。若因删除而使二叉排序树
失去平衡,则作平衡旋转处理,布尔变量shorter反映t变矮与否
*/
bool deleteAVL(AVL& t, KeyType key, bool& shorter)
{
if(t == NULL) //不存在该元素
{
return false; //删除失败
}
else if(EQ(key, t->data.key)) //找到元素结点
{
AVLNode* q = NULL;
if(t->lchild == NULL) //左子树为空
{
q = t;
t = t->rchild;
delete q;
shorter = true;
}
else if(t->rchild == NULL) //右子树为空
{
q = t;
t = t->lchild;
delete q;
shorter = true;
}
else //左右子树都存在,
{
q = t->lchild;
while(q->rchild)
{
q = q->rchild;
}
t->data = q->data;
deleteAVL(t->lchild, q->data.key, shorter); //在左子树中递归删除前驱结点
}
}
else if(LT(key, t->data.key)) //左子树中继续查找
{
if(!deleteAVL(t->lchild, key, shorter))
{
return false;
}
if(shorter)
{
switch(t->bf)
{
case LH:
t->bf = EH;
shorter = true;
break;
case EH:
t->bf = RH;
shorter = false;
break;
case RH:
rightBalance(t); //右平衡处理
if(t->rchild->bf == EH)//注意这里,画图思考一下
shorter = false;
else
shorter = true;
break;
}
}
}
else //右子树中继续查找
{
if(!deleteAVL(t->rchild, key, shorter))
{
return false;
}
if(shorter)
{
switch(t->bf)
{
case LH:
leftBalance(t); //左平衡处理
if(t->lchild->bf == EH)//注意这里,画图思考一下
shorter = false;
else
shorter = true;
break;
case EH:
t->bf = LH;
shorter = false;
break;
case RH:
t->bf = EH;
shorter = true;
break;
}
}
}
return true;
}
case RH:
rightBalance(t); //右平衡处理
if(t->rchild->bf == EH)//注意这里,画图思考一下
shorter = false;
else
shorter = true;
break;
}