#include<stdio.h>
#include<stdlib.h>
struct node{
int key;
char color;
struct node * up;
struct node * left;
struct node * right;
} * root;
void in_order_tree_walk( struct node * X) {
if ( X!= NULL) {
in_order_tree_walk( X-> left) ;
printf ( "%d %c\n " , X
-> key
, X
-> color
) ; in_order_tree_walk( X-> right) ;
}
}
struct node* tree_search( struct node * X, int k) {
if ( X== NULL || k== X-> key)
return X;
if ( k< X-> key)
return tree_search( X-> left, k) ;
else
return tree_search( X-> right, k) ;
}
struct node* tmp_node( int k) {
struct node
* tmp
= ( struct node
* ) malloc ( sizeof * root
) ; tmp-> up = NULL;
tmp-> left = NULL;
tmp-> right = NULL;
tmp-> key = k;
tmp-> color = 'R' ;
return tmp;
}
void tree_insert( struct node * T, struct node * Z) {
if ( T == NULL) {
T = Z;
return ;
}
else {
if ( Z-> key < T-> key) {
tree_insert( T-> left, Z) ;
T-> left-> up = T;
}
else if ( Z-> key > T-> key) {
tree_insert( T-> right, Z) ;
T-> right-> up = T;
}
}
}
void left_rotate( struct node * X) {
struct node * Y = X-> right;
X-> right = Y-> left;
if ( Y-> left != NULL)
Y-> left-> up = X;
Y-> up = X-> up;
if ( X-> up == NULL)
root = Y;
else if ( X == X-> up-> left)
X-> up-> left = Y;
else X-> up-> right = Y;
Y-> left = X;
X-> up = Y;
}
void right_rotate( struct node * X) {
struct node * Y = X-> left;
X-> left = Y-> right;
if ( Y-> right != NULL)
Y-> right-> up = X;
Y-> up = X-> up;
if ( X-> up == NULL)
root = Y;
else if ( X == X-> up-> left)
X-> up-> left = Y;
else X-> up-> right = Y;
Y-> right = X;
X-> up = Y;
}
void RB_Insert( struct node * T, int k) {
struct node * X = tmp_node( k) ;
tree_insert( T, X) ;
X-> color = 'R' ;
while ( X != root && X-> up-> color == 'R' ) {
if ( X-> up = X-> up-> up-> left) {
struct node * Y = X-> up-> up-> right;
if ( Y-> color == 'R' ) {
X-> up-> color = 'B' ;
Y-> color = 'B' ;
X-> up-> up-> color = 'R' ;
X = X-> up-> up;
}
else {
if ( X == X-> up-> right) {
X = X-> up;
left_rotate( X) ;
}
X-> up-> color = 'B' ;
X-> up-> up-> color = 'R' ;
right_rotate( X-> up-> up) ;
}
}
else {
struct node * Y = X-> up-> up-> left;
if ( Y-> color == 'R' ) {
X-> up-> color = 'B' ;
Y-> color = 'B' ;
X-> up-> up-> color = 'R' ;
X = X-> up-> up;
}
else {
if ( X == X-> up-> left) {
X = X-> up;
right_rotate( X) ;
}
X-> up-> color = 'B' ;
X-> up-> up-> color = 'R' ;
left_rotate( X-> up-> up) ;
}
}
}
root-> color = 'B' ;
}
int main( ) {
root = NULL;
int T[ ] = { 5 , 26 , 17 , 8 , 9 , 30 , 10 , 1 , 23 } ;
int i;
for ( i= 0 ; i< 9 ; i++ ) {
RB_Insert( root, T[ i] ) ;
}
in_order_tree_walk( root) ;
return 0 ;
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8c3RkbGliLmg+CgpzdHJ1Y3Qgbm9kZXsKICAgIGludCBrZXk7CiAgICBjaGFyIGNvbG9yOwogICAgc3RydWN0IG5vZGUgKnVwOwogICAgc3RydWN0IG5vZGUgKmxlZnQ7CiAgICBzdHJ1Y3Qgbm9kZSAqcmlnaHQ7Cn0qcm9vdDsKCgp2b2lkIGluX29yZGVyX3RyZWVfd2FsayhzdHJ1Y3Qgbm9kZSAqWCl7CiAgICBpZihYIT1OVUxMKXsKICAgICAgICBpbl9vcmRlcl90cmVlX3dhbGsoWC0+bGVmdCk7CiAgICAgICAgcHJpbnRmKCIlZCAlY1xuIiwgWC0+a2V5LCBYLT5jb2xvcik7CiAgICAgICAgaW5fb3JkZXJfdHJlZV93YWxrKFgtPnJpZ2h0KTsKICAgIH0KfQoKc3RydWN0IG5vZGUqIHRyZWVfc2VhcmNoKHN0cnVjdCBub2RlICpYLCBpbnQgayl7CiAgICBpZihYPT1OVUxMIHx8IGs9PVgtPmtleSkKICAgICAgICByZXR1cm4gWDsKICAgIGlmKGs8WC0+a2V5KQogICAgICAgIHJldHVybiB0cmVlX3NlYXJjaChYLT5sZWZ0LCBrKTsKICAgIGVsc2UKICAgICAgICByZXR1cm4gdHJlZV9zZWFyY2goWC0+cmlnaHQsIGspOwp9CgpzdHJ1Y3Qgbm9kZSogdG1wX25vZGUoaW50IGspewogICAgc3RydWN0IG5vZGUgKnRtcCA9IChzdHJ1Y3Qgbm9kZSopbWFsbG9jKHNpemVvZiAqcm9vdCk7CiAgICB0bXAtPnVwID0gTlVMTDsKICAgIHRtcC0+bGVmdCA9IE5VTEw7CiAgICB0bXAtPnJpZ2h0ID0gTlVMTDsKICAgIHRtcC0+a2V5ID0gazsKICAgIHRtcC0+Y29sb3IgPSAnUic7CiAgICByZXR1cm4gdG1wOwp9Cgp2b2lkIHRyZWVfaW5zZXJ0KHN0cnVjdCBub2RlICpULCBzdHJ1Y3Qgbm9kZSAqWil7CiAgICBpZiAoVCA9PSBOVUxMKXsKICAgICAgICBUID0gWjsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBlbHNlewogICAgICAgIGlmIChaLT5rZXkgPCBULT5rZXkpewogICAgICAgIHRyZWVfaW5zZXJ0KFQtPmxlZnQsIFopOwogICAgICAgIFQtPmxlZnQtPnVwID0gVDsKICAgIH0KICAgIGVsc2UgaWYgKFotPmtleSA+IFQtPmtleSl7CiAgICAgICAgdHJlZV9pbnNlcnQoVC0+cmlnaHQsWik7CiAgICAgICAgVC0+cmlnaHQtPnVwID0gVDsKICAgIH0KICB9Cn0KCnZvaWQgbGVmdF9yb3RhdGUoc3RydWN0IG5vZGUgKlgpewogICAgc3RydWN0IG5vZGUgKlkgPSBYLT5yaWdodDsKICAgIFgtPnJpZ2h0ID0gWS0+bGVmdDsKICAgIGlmKFktPmxlZnQgIT0gTlVMTCkKICAgICAgICBZLT5sZWZ0LT51cCA9IFg7CiAgICBZLT51cCA9IFgtPnVwOwogICAgaWYoWC0+dXAgPT0gTlVMTCkKICAgICAgICByb290ID0gWTsKICAgIGVsc2UgaWYoIFggPT0gWC0+dXAtPmxlZnQpCiAgICAgICAgWC0+dXAtPmxlZnQgPSBZOwogICAgICAgIGVsc2UgWC0+dXAtPnJpZ2h0ID0gWTsKICAgIFktPmxlZnQgPSBYOwogICAgWC0+dXAgPSBZOwp9Cgp2b2lkIHJpZ2h0X3JvdGF0ZShzdHJ1Y3Qgbm9kZSAqWCl7CiAgICBzdHJ1Y3Qgbm9kZSAqWSA9IFgtPmxlZnQ7CiAgICBYLT5sZWZ0ID0gWS0+cmlnaHQ7CiAgICBpZihZLT5yaWdodCAhPSBOVUxMKQogICAgICAgIFktPnJpZ2h0LT51cCA9IFg7CiAgICBZLT51cCA9IFgtPnVwOwogICAgaWYoWC0+dXAgPT0gTlVMTCkKICAgICAgICByb290ID0gWTsKICAgIGVsc2UgaWYoIFggPT0gWC0+dXAtPmxlZnQpCiAgICAgICAgWC0+dXAtPmxlZnQgPSBZOwogICAgZWxzZSBYLT51cC0+cmlnaHQgPSBZOwogICAgWS0+cmlnaHQgPSBYOwogICAgWC0+dXAgPSBZOwp9Cgp2b2lkIFJCX0luc2VydChzdHJ1Y3Qgbm9kZSAqVCwgaW50IGspewogICAgc3RydWN0IG5vZGUgKlggPSB0bXBfbm9kZShrKTsKICAgIHRyZWVfaW5zZXJ0KFQsIFgpOwogICAgWC0+Y29sb3IgPSAnUic7CiAgICB3aGlsZShYICE9IHJvb3QgJiYgWC0+dXAtPmNvbG9yID09ICdSJyl7CiAgICAgICAgaWYoWC0+dXAgPSBYLT51cC0+dXAtPmxlZnQpewogICAgICAgICAgICBzdHJ1Y3Qgbm9kZSAqWSA9IFgtPnVwLT51cC0+cmlnaHQ7CiAgICAgICAgICAgIGlmKFktPmNvbG9yID09ICdSJyl7CiAgICAgICAgICAgICAgICBYLT51cC0+Y29sb3IgPSAnQic7CiAgICAgICAgICAgICAgICBZLT5jb2xvciA9ICdCJzsKICAgICAgICAgICAgICAgIFgtPnVwLT51cC0+Y29sb3IgPSAnUic7CiAgICAgICAgICAgICAgICBYID0gWC0+dXAtPnVwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICBpZiAoWCA9PSBYLT51cC0+cmlnaHQpewogICAgICAgICAgICAgICAgWCA9IFgtPnVwOwogICAgICAgICAgICAgICAgbGVmdF9yb3RhdGUoWCk7CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgWC0+dXAtPmNvbG9yID0gJ0InOwogICAgICAgICAgICAgICAgWC0+dXAtPnVwLT5jb2xvciA9ICdSJzsKICAgICAgICAgICAgICAgIHJpZ2h0X3JvdGF0ZShYLT51cC0+dXApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2V7CiAgICAgICAgICAgIHN0cnVjdCBub2RlICpZID0gWC0+dXAtPnVwLT5sZWZ0OwogICAgICAgICAgICBpZihZLT5jb2xvciA9PSAnUicpewogICAgICAgICAgICAgICAgWC0+dXAtPmNvbG9yID0gJ0InOwogICAgICAgICAgICAgICAgWS0+Y29sb3IgPSAnQic7CiAgICAgICAgICAgICAgICBYLT51cC0+dXAtPmNvbG9yID0gJ1InOwogICAgICAgICAgICAgICAgWCA9IFgtPnVwLT51cDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgaWYgKFggPT0gWC0+dXAtPmxlZnQpewogICAgICAgICAgICAgICAgWCA9IFgtPnVwOwogICAgICAgICAgICAgICAgcmlnaHRfcm90YXRlKFgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgWC0+dXAtPmNvbG9yID0gJ0InOwogICAgICAgICAgICAgICAgWC0+dXAtPnVwLT5jb2xvciA9ICdSJzsKICAgICAgICAgICAgICAgIGxlZnRfcm90YXRlKFgtPnVwLT51cCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByb290LT5jb2xvciA9ICdCJzsKfQoKaW50IG1haW4oKXsKCiAgICByb290ID0gTlVMTDsgCiAgICBpbnQgVFtdID0gezUsMjYsMTcsOCw5LDMwLDEwLDEsMjN9OwogICAgaW50IGk7CiAgICBmb3IoaT0wOyBpPDk7IGkrKyl7CiAgICAgICAgcHJpbnRmKCIlZCIsIFRbaV0pOwogICAgICAgIFJCX0luc2VydChyb290LCBUW2ldKTsKICAgIH0KICAgIHByaW50ZigiXG4iKTsKICAgIGluX29yZGVyX3RyZWVfd2Fsayhyb290KTsKCiAgICByZXR1cm4gMDsKfQ==