由于在A左子树根结点的左子树上插入结点C,A的平衡因子由1增至2,致使以A为根的子树失去平衡,则需要进行一次向右的顺时针旋转操作,如下图所示。
由于在A的右子树根结点的右子树上插入结点C,A的平衡因子由-1变为-2,致使以A为根结点的子树失去平衡,则需进行一次向左的逆时针旋转操作,如下图所示。
由于在A的左子树根结点的右子树上插入结点,A的平衡因子由1增至2,致使以A为根结点的子树失去平衡,则需要进行二次旋转操作。第一次对B及其右子树进行逆时针旋转,C转上去成为B的根,这时变成了LL型,所以第二次进行LL型的顺时针旋转即可恢复平衡。如果C原来有左子树,则调整C的左子树为B的右子树,如下图所示。
由于在A的右子树根结点的左子树上插入结点,A的平衡因子由-1变为-2,致使以A为根结点的子树失去平衡,则旋转方法和LR型相对称,也需进行两次旋转,第一次对B及其左子树进行顺时针右旋,C转上去成为B的根,这时变成了RR型,再进行RR型的逆时针左旋,如下图所示。
void DeleteBST(TreeNodeP &T, int key)
{
if (T == NULL)
{
return;
}
else
{
if (key > T->data)
{
DeleteBST(T->rchild, key);
}
else if (key < T->data)
{
DeleteBST(T->lchild, key);
}
else
{
Delete(T);
return;
}
}
}
void Delete(TreeNodeP &T)
{
TreeNodeP q = T;
if (T->lchild == NULL)
{
q = T;
T = T->rchild;
free(q);
}
else if (T->rchild == NULL)
{
q = T;
T = T->lchild;
free(q);
}
else
{
Deletel(T, T->lchild);
}
}
void Deletel(TreeNodeP& T, TreeNodeP& p)
{
TreeNodeP q;
if (p->rchild != NULL)
{
Deletel(T, p->rchild);
}
else
{
T->data = p->data;
q = p;
p = p->lchild;
free(q);
}
}
原文:https://www.cnblogs.com/zx224569/p/12781418.html