情況3:key節點的兄弟w節點爲黑色,w節點的左子節點爲紅色,右子節點爲黑色。
int RBT_delete_fix(RBT* T,Node *x)
{
if(T == NULL || (*T) == NULL || x == NULL)
{
return 0 ;
}
while(x != (*T) && x->color == BLACK)
{
if(x == x->parent->left) // x is parent left child.
{
Node *parent = x->parent;
COLOR bc = BLACK ;
if(parent->right != NULL)
{
bc = parent->right->color ;
}
if(bc == RED)//case 4 brother is red.
{//the parent must be black.
parent->color = RED;
parent->right->color = BLACK ;
LEFT_ROATE(T,parent);
}else{//case 2 3 4 brother is black. 1 else
COLOR blc = BLACK ;
COLOR brc = BLACK ;
if(parent->right->left != NULL)
{
blc = parent->right->left->color ;
}
if(parent->right->right != NULL)
{
brc = parent->right->right->color ;
}
if(blc == BLACK && brc == BLACK)//CASE 1
{
parent->right->color = RED;
x = parent ;
}else
{
if(blc == RED && brc == BLACK)// case 3
{
parent->right->color = RED ;
parent->right->left->color = BLACK ;
RIGHT_ROATE(T,parent->right);
}
//case 2
parent->right->right->color = BLACK ;
parent->right->color = parent->color;
parent->color = BLACK ;
LEFT_ROATE(T,parent);
x = (*T); // break the while.
}
}// 1 else
}else{// x is parent right child.
Node *parent = x->parent;
COLOR bc = BLACK ;
if(parent->left != NULL)
{
bc = parent->left->color ;
}
if(bc == RED)//case 4 brother is red.
{//the parent must be black.
parent->color = RED;
parent->left->color = BLACK ;
LEFT_ROATE(T,parent);
}else{//case 2 3 4 brother is black. 1 else
COLOR blc = BLACK ;
COLOR brc = BLACK ;
if(parent->left->left != NULL)
{
blc = parent->left->left->color ;
}
if(parent->left->right != NULL)
{
brc = parent->left->right->color ;
}
if(blc == BLACK && brc == BLACK)//CASE 1
parent->left->color = RED;
x = parent ;
}else
{
if(blc == BLACK && brc == RED)// case 3
parent->left->color = RED ;
parent->left->left->color = BLACK ;
LEFT_ROATE(T,parent->left);
}
//case 2
parent->left->color = parent->color;
parent->color = BLACK ;
RIGHT_ROATE(T,parent);
x = (*T); // break the while.
}
}// 1 else
}
}//end while
x->color = BLACK ;
}
Node * treeSuccessor(Node *x)
{
if(x == NULL || x->right == NULL || x->left == NULL )
{
return NULL ;
}
Node *cur = x->right ;
//x = cur ;
while(cur != NULL)
{
x = cur ;
cur = cur->left ;
}
return x ;
}
int RBT_delete(RBT *T,int key)
{
if(T == NULL || (*T) == NULL )
{
return 0 ;// error .
}
Node *root = *T ;
Node *cur = root ;
// find the key .
while(cur != NULL)
{
if(cur->key == key)
{
break ;
}
if(cur->key > key )
{
cur = cur->left ;
}else
{
cur = cur->right ;
}
}
if(cur == NULL )
{
return 0 ;// not find key .
}
Node *y = cur ;
if(cur->right != NULL && cur -> left != NULL)
{// find the
y = treeSuccessor(cur);
}
// 刪除
if(y != cur )
{
cur->key = y->key ;//125489
}
Node *parent = y->parent ;
Node *x = NULL ;
if(y->left != NULL)
{
x = y->left ;
}else
{
x = y->right ;
}
if(x != NULL )
{
x->parent = parent ;
if(parent != NULL)
{
if(y == parent->left)
{
parent->left = x ;
}else
{
parent ->right = x ;
}
}else// y is root .
{
(*T) = x ;
}
if(y->color == BLACK)
{
RBT_delete_fix(T,x);
}
delete y ;
}else
{// x is null .
x = new Node ;
x->parent = parent ;
x->color = BLACK ;
if(parent == NULL)// root is only.
{
(*T) = NULL ;
delete y ;
delete x ;
return 1 ;
}
if(y == parent->left)
{
parent ->left = x ;
}else
{
parent->right = x ;
}
if(y ->color == BLACK)
{
RBT_delete_fix(T,x);
}
parent = x->parent ;
if(x == parent->left)
{
parent->left = NULL ;
}else
{
parent->right = NULL ;
}
delete y ;
delete x ;
}
return 1 ;
}