#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
struct node * left;
char color;
struct node * right;
struct node * p;
int data;
} node;
node * root = NULL;
struct node * newNode( int key)
{
struct node
* temp
= ( struct node
* ) malloc ( sizeof ( struct node
) ) ; temp-> data = key;
temp-> left = temp-> right = NULL;
temp-> color= 'R' ;
return temp;
}
void left_rotate( node * x ) {
node * y;
y = x-> right;
x-> right = y-> left;
if ( y-> left != NULL )
y-> left-> p = x;
y-> p = x-> p;
if ( x-> p == NULL ) root = y;
else
if ( x == ( x-> p) -> left )
x-> p-> left = y;
else
x-> p-> right = y;
y-> left = x;
x-> p = y;
return ;
}
void right_rotate( node * x ) {
node * y;
y = x-> left;
x-> left = y-> right;
if ( y-> right != NULL )
y-> right-> p = x;
y-> p = x-> p;
if ( x-> p == NULL ) root = y;
else
if ( x == ( x-> p) -> right )
x-> p-> right = y;
else
x-> p-> left = y;
y-> right = x;
x-> p = y;
return ;
}
void rbinsert ( int val) {
node * z= newNode( val) ;
node * x = root;
node * y;
while ( x != NULL)
{
y = x;
if ( z-> data < x-> data)
x = x-> left;
else x = x-> right;
}
z-> p = y;
if ( y == NULL)
root = z;
else if ( z-> data < y-> data)
y-> left = z;
else y-> right = z;
z-> left = NULL;
z-> right = NULL;
z-> color = 'R' ;
rb_fix( z) ;
return ;
}
void rb_fix( int val)
{
node * z= newNode( val) ;
node* y;
while ( z-> p-> color = 'R' )
{
if ( z-> p == z-> p-> p-> left)
{
y= z-> p-> p-> right;
if ( y-> color== 'R' )
{
z-> p-> color= 'B' ;
y-> color= 'B' ;
z-> p-> p-> color= 'R' ;
z= z-> p-> p;
}
else
{
if ( z== z-> p-> right)
{
z= z-> p;
left_rotate( z) ;
}
z-> p-> color= 'B' ;
z-> p-> p-> color= 'R' ;
right_rotate( z-> p-> p) ;
}
else
{
y= z-> p-> p-> left;
if ( y-> color== 'R' )
{
z-> p-> color= 'B' ;
y-> color= 'B' ;
z-> p-> p-> color= 'R' ;
z= z-> p-> p;
}
else
{
if ( z== z-> p-> left)
{
z= z-> p;
right_rotate( z) ;
}
z-> p-> color= 'B' ;
z-> p-> p-> color= 'R' ;
left_rotate( z-> p-> p) ;
}
}
}
root-> color= 'B' ;
}
void prefixtour( node * p)
{
if ( p== NULL)
{
return ;
}
else
visit( p) ;
return ;
}
void visit( node * x)
{
if ( x!= NULL)
{
visit( x-> left) ;
if ( x-> p== NULL)
printf ( "%d %c NIL\n " , x
-> data
, x
-> color
) ; else
printf ( "%d %c %d\n " , x
-> data
, x
-> color
, x
-> p
-> data
) ; visit( x-> right) ;
}
return ;
}
int main( )
{
int n;
int i, key;
for ( i= 0 ; i< n; i++ )
{
rbinsert( key) ;
}
prefixtour( root) ;
return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCnR5cGVkZWYgc3RydWN0IG5vZGUKewoJc3RydWN0IG5vZGUgKmxlZnQ7CgljaGFyIGNvbG9yOwoJc3RydWN0IG5vZGUgKnJpZ2h0OwoJc3RydWN0IG5vZGUgKnA7CglpbnQgZGF0YTsKfW5vZGU7Cm5vZGUgKnJvb3QgPSBOVUxMOwoKc3RydWN0IG5vZGUgKm5ld05vZGUoaW50IGtleSkKewogICAgc3RydWN0IG5vZGUgKnRlbXAgPSAgKHN0cnVjdCBub2RlICopbWFsbG9jKHNpemVvZihzdHJ1Y3Qgbm9kZSkpOwogICAgdGVtcC0+ZGF0YSA9IGtleTsKICAgIHRlbXAtPmxlZnQgPSB0ZW1wLT5yaWdodCA9IE5VTEw7CiAgICB0ZW1wLT5jb2xvcj0nUic7CiAgICByZXR1cm4gdGVtcDsKfQogCiB2b2lkIGxlZnRfcm90YXRlKCBub2RlICp4ICkgewogICAgbm9kZSAqeTsKICAgIHkgPSB4LT5yaWdodDsKICAgIHgtPnJpZ2h0ID0geS0+bGVmdDsKICAgIGlmICggeS0+bGVmdCAhPSBOVUxMICkKICAgICAgICB5LT5sZWZ0LT5wID0geDsKICAgIHktPnAgPSB4LT5wOwoKICAgIGlmICggeC0+cCA9PSBOVUxMICkgcm9vdCA9IHk7CiAgICBlbHNlCiAgICAgICAgaWYgKCB4ID09ICh4LT5wKS0+bGVmdCApCiAgICAgICAgICAgICB4LT5wLT5sZWZ0ID0geTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIAogICAgICAgICAgICB4LT5wLT5yaWdodCA9IHk7CiAgICB5LT5sZWZ0ID0geDsKICAgIHgtPnAgPSB5OwogICAgcmV0dXJuOwogICAgfQoKdm9pZCByaWdodF9yb3RhdGUoIG5vZGUgKnggKSB7CiAgICBub2RlICp5OwogICAgeSA9IHgtPmxlZnQ7CiAgICB4LT5sZWZ0ID0geS0+cmlnaHQ7CiAgICBpZiAoIHktPnJpZ2h0ICE9IE5VTEwgKQogICAgICAgIHktPnJpZ2h0LT5wID0geDsKCQl5LT5wID0geC0+cDsKICAgIGlmICggeC0+cCA9PSBOVUxMICkgcm9vdCA9IHk7CiAgICBlbHNlCiAgICAgICAgaWYgKCB4ID09ICh4LT5wKS0+cmlnaHQgKQogIAkJCXgtPnAtPnJpZ2h0ID0geTsKICAgICAgICBlbHNlCiAgICAgICAgICAJICB4LT5wLT5sZWZ0ID0geTsKICAgICAgICAgIAkgeS0+cmlnaHQgPSB4OwogICAgCQl4LT5wID0geTsKICAgIAkJcmV0dXJuOwogICAgfQoKCgp2b2lkIHJiaW5zZXJ0IChpbnQgdmFsKSB7Cglub2RlICp6PW5ld05vZGUodmFsKTsKICAgIG5vZGUgKnggPSByb290OwogICAgbm9kZSAqeTsKIHdoaWxlICh4ICE9IE5VTEwpCiAJewogCQl5ID0geDsKIAkJaWYgKHotPmRhdGEgPCB4LT5kYXRhKQogCQkJeCA9IHgtPmxlZnQ7CiAJCWVsc2UgeCA9IHgtPnJpZ2h0OwogCX0KCiB6LT5wID0geTsKIGlmICh5ID09IE5VTEwpCiAJcm9vdCA9IHo7CiBlbHNlIGlmICh6LT5kYXRhIDwgeS0+ZGF0YSkKIAl5LT5sZWZ0ID0gejsKIGVsc2UgeS0+cmlnaHQgPSB6Owogei0+bGVmdCA9IE5VTEw7CiB6LT5yaWdodCA9IE5VTEw7CiB6LT5jb2xvciA9ICdSJzsKIHJiX2ZpeCh6KSA7CiByZXR1cm47Cn0KCgogdm9pZCByYl9maXgoaW50IHZhbCkKIHsKIAlub2RlICp6PW5ld05vZGUodmFsKTsKIAlub2RlKnk7CiAJd2hpbGUgKHotPnAtPmNvbG9yID0gJ1InKQogCXsKICAgICAgaWYgKHotPnAgPT0gei0+cC0+cC0+bGVmdCkKICAgICAgCXsKICAgICAgCQl5PXotPnAtPnAtPnJpZ2h0OwogICAgICAJCWlmKHktPmNvbG9yPT0nUicpCiAgICAgIAkJewogICAgICAJCQl6LT5wLT5jb2xvcj0nQic7CiAgICAgIAkJCXktPmNvbG9yPSdCJzsKICAgICAgCQkJei0+cC0+cC0+Y29sb3I9J1InOwogICAgICAJCQl6PXotPnAtPnA7CiAgICAgIAkJfQogICAgICAJCWVsc2UKICAgICAgCQl7IAogICAgICAJCQlpZiAoej09ei0+cC0+cmlnaHQpCiAgICAgIAkJCXsKICAgICAgCQkJCXo9ei0+cDsKICAgICAgCQkJCWxlZnRfcm90YXRlKHopOwogICAgICAJCQl9CiAgICAgIAkJei0+cC0+Y29sb3I9J0InOwogICAgICAJCXotPnAtPnAtPmNvbG9yPSdSJzsKICAgICAgCQlyaWdodF9yb3RhdGUoei0+cC0+cCk7CiAgICAgIAkJfQkKICAgICAgCQllbHNlCiAgICAgIAkJewogICAgICAJCQkJeT16LT5wLT5wLT5sZWZ0OwogICAgICAJCWlmKHktPmNvbG9yPT0nUicpCiAgICAgIAkJewogICAgICAJCQl6LT5wLT5jb2xvcj0nQic7CiAgICAgIAkJCXktPmNvbG9yPSdCJzsKICAgICAgCQkJei0+cC0+cC0+Y29sb3I9J1InOwogICAgICAJCQl6PXotPnAtPnA7CiAgICAgIAkJfQogICAgICAJCWVsc2UKICAgICAgCQl7IAogICAgICAJCQlpZiAoej09ei0+cC0+bGVmdCkKICAgICAgCQkJewogICAgICAJCQkJej16LT5wOwogICAgICAJCQkJcmlnaHRfcm90YXRlKHopOwogICAgICAJCQl9CiAgICAgIAkJei0+cC0+Y29sb3I9J0InOwogICAgICAJCXotPnAtPnAtPmNvbG9yPSdSJzsKICAgICAgCQlsZWZ0X3JvdGF0ZSh6LT5wLT5wKTsKICAgICAgCQl9CQogICAgICAJCX0KIAl9CiAJcm9vdC0+Y29sb3I9J0InOwogfQoKdm9pZCBwcmVmaXh0b3VyKG5vZGUgKnApCnsKCWlmIChwPT1OVUxMKQoJCXsKCQlwcmludGYoImVtcHR5IHRyZWUiKTsKCQlyZXR1cm4gOwoJfQoKCWVsc2UKCQl2aXNpdChwKTsKCXJldHVybiA7Cn0KCnZvaWQgdmlzaXQoIG5vZGUgKngpCnsKCWlmKHghPU5VTEwpCgl7CgoJCXZpc2l0KHgtPmxlZnQpOwoJCWlmKHgtPnA9PU5VTEwpCgkJcHJpbnRmKCAiJWQgJWMgTklMXG4iLHgtPmRhdGEseC0+Y29sb3IpOwoJCWVsc2UKCQlwcmludGYoICIlZCAlYyAlZFxuIix4LT5kYXRhLHgtPmNvbG9yLHgtPnAtPmRhdGEpOwoJCXZpc2l0KHgtPnJpZ2h0KTsKCX0KCXJldHVybjsKfQoKaW50IG1haW4oKQp7CglpbnQgbjsKCXNjYW5mKCIlZCIsJm4pOwoJaW50IGksa2V5OwoJZm9yKGk9MDtpPG47aSsrKQoJewogICAgCXNjYW5mKCIlZCIsJmtleSk7CiAgICAJcmJpbnNlcnQoa2V5KTsKCX0KCXByZWZpeHRvdXIocm9vdCk7CnJldHVybiAwOwoKfQoK