经过自动压力测试的红黑树(删除功能完备)(三)

2014-11-24 00:11:55 · 作者: · 浏览: 112
;

redblack *uncle_right;

while(1)

{

if (curnode->m_color==RED)

{

curnode->m_color=BLACK;

parent=curnode->parent;

if(!parent)

{

node->root=curnode;

}

return ;

}

else

{

parent=curnode->parent;

if(!parent)

{

node->root=curnode;

return ;

}

if(0==mode)

{

uncle=parent->right;

if(!uncle)

{

return ;

}

if (uncle->m_color== RED)

{

uncle->m_color=BLACK;

parent->m_color=RED;

rotate_left (parent,uncle );

if (!uncle->parent)

{

node->root=uncle;

}

}

else

{

uncle_left=uncle->left;

uncle_right=uncle->right;

if( (!uncle_left || uncle_left->m_color==BLACK )

&&

(!uncle_right || uncle_right->m_color==BLACK))

{

uncle->m_color=RED;

curnode=parent;

}

else

{

if( !uncle_right || (uncle_right&& uncle_right->m_color==RED))

{

uncle->m_color=parent->m_color;

parent->m_color=BLACK;

if(uncle_right)

{

uncle_right->m_color=BLACK;

}

rotate_left( parent,uncle);

if (!uncle->parent)

{

node->root=uncle;

}

return ;

}

else

{

uncle_left->m_color=BLACK;

uncle->m_color=RED;

rotate_right(uncle_left,uncle);

uncle=parent->right;

uncle->right=uncle->right;

uncle->m_color=parent->m_color;

parent->m_color=BLACK;

uncle_right->m_color=BLACK;

rotate_left( parent,uncle);

if (!uncle->parent)

{

node->root=uncle;

}

return ;

}

}

}

}

else

{

uncle=parent->left;

if(!uncle)

{

return ;

}

if (uncle->m_color== RED)

{

uncle->m_color=BLACK;

parent->m_color=RED;

rotate_right (uncle ,parent);

if (!uncle->parent)

{

node->root=uncle;

}

}

else

{

uncle_left=uncle->left;

uncle_right=uncle->right;

if( (!uncle_left || uncle_left->m_color==BLACK )

&&

(!uncle_right || uncle_right->m_color==BLACK))

{

uncle->m_color=RED;

curnode=parent;

}

else

{

if( !uncle_left || ( uncle_left && uncle_left->m_color==RED))

{

uncle->m_color=parent->m_color;

parent->m_color=BLACK;

if(uncle_left)

{

uncle_left->m_color=BLACK;

}

rotate_right( uncle , parent);

if (!uncle->parent)

{

node->root=uncle;

}

return ;

}

else

{

uncle->m_color=RED;

uncle_right->m_color=BLACK;

rotate_left( uncle ,uncle_right);

uncle=parent->left;

uncle_left=uncle->left;

uncle->m_color=parent->m_color;

parent->m_color=BLACK;

uncle_left->m_color=BLACK;

rotate_right( uncle , parent);

if (!uncle->parent)

{

node->root=uncle;

}

return ;

}

}

}

}

}

}

}

void delete (wrapdata *node ,int data)

{

redblack * drop;

redblack *suc;

redblack *curnode;

int value;

int mode;

if ( drop=find ( node->root ,data))

{

pri