You are on page 1of 3

#include <stdio.

h>
#include <stdlib.h>
typedef struct rb_node

{ enum {red, black} color;


int key;
struct rb_node *left, *right, *parent;

} t_rb_node;

typedef struct
{
t_rb_node *root;

} t_rb_arbore;

void inorder_walk (t_rb_node* root)


{
if (root!=NULL)
{ inorder_walk(root->left);
printf("%d", root->key);
if (root->color==black)
printf("[b]");
else printf("[r]");
inorder_walk(root->right);
}
}

void make_root(t_rb_arbore* a, int key)


{ a->root=(t_rb_arbore*) malloc (sizeof(t_rb_arbore));
a->root->key=key;
a->root->left=NULL;
a->root->right=NULL;
a->root->parent=NULL;
a->root->color=black;

int create_node(t_rb_node *t, int key)


{ t_rb_node *node;
node=(t_rb_node*) malloc (sizeof(t_rb_node));
node->key=key;
node->left=NULL;
node->right=NULL;
node->parent=NULL;
node->color=black;
return node;
}

int tree_search(t_rb_node* n, int key)


{ if ((n==NULL)||(key=n->key))
return n;
if (key<n->key)
return tree_search(n->left,key);
else
return tree_search(n->right,key);
}

void left_rotate(t_rb_arbore *t, t_rb_node *x)


{ t_rb_node *y;
y=x->right;
x->right=y->left;
if (y->left!=NULL)
y->left->parent=x;
y->parent=x->parent;
if (x->parent!=NULL)
t->root=y;
else if (x==x->parent->left)
x->parent->left=y;
else x->parent->right=y;

y->left=x;
x->parent=y;
}

void rb_insert_fixup(t_rb_arbore* t, t_rb_node* z)


{ t_rb_node * y;
while (z->parent->color=red)
{if (z->parent==z->parent->parent->left)
{y=z->parent->parent->right;
if (y->color==red)
{ z->parent->color=black;
y->color=black;
z->parent->color=red;
z=z->parent->parent;
}
else if (z==z->parent->right)
{z=z->parent;
left_rotate(t,z);
}

z->parent->color=black;
z->parent->parent->color=red;
right_rotate(t,z->parent->parent);
}
else
{ if (y->color==red)
{ z->parent->color=black;
y->color=black;
z->parent->color=red;
z=z->parent->parent;
}
else if (z==z->parent->right)
{z=z->parent;
left_rotate(t,z);
}

z->parent->color=black;
z->parent->parent->color=red;
right_rotate(t,z->parent->parent);
}
}
t->root->color=black;
}
rb_insert(t_rb_arbore *t, t_rb_node *z)
{ t_rb_node* y=NULL;
t_rb_node* x=t->root;
while (x!=NULL)
{ y=z;
if (z->key<x->key)
x=x->left;
else
x=x->right;
}

z->parent=y;

if (z->key<y->key)
y->left=z;
else
y->right=x;

z->left=NULL;
z->right=t->NULL;
z->color=red;
rb_insert_fixup(t,z);
}
int main ()
{ t_rb_arbore *t;
t_rb_node *n;
int x;

printf("Root="); scanf ("%d", &x);


make_root(t,x);
printf("Introduceti x pana la citirea 0");
printf("x="); scanf("%d", &x);

while (x!=0)
{ n=create_node(t,x);
rb_insert(t,n);
printf("x="); scanf("%d", &x);
}
printf("In-order walk:");
inorder_walk(t);
printf("\n");
printf("Regasire nod x="); scanf("%d",&x);
n= tree_search(t->root,x);
if(n!=NULL)
printf("Nodul cu cheia %d gasit", n->key);
else
printf("Nodul nu a fost gasit");

You might also like