#ifndef RB_TREE_H_
#define RB_TREE_H_
typedef struct RB_TREE_NODE
{
int color;
unsigned long long key;
void* data;
struct RB_TREE_NODE* p;
struct RB_TREE_NODE* left;
struct RB_TREE_NODE* right;
} RB_TREE_NODE;
typedef struct RB_TREE
{
RB_TREE_NODE* root;
RB_TREE_NODE* nil;
} RB_TREE;
RB_TREE* rb_tree_create();
RB_TREE_NODE* rb_tree_find(RB_TREE* tree, unsigned long long key);
void rb_tree_insert(RB_TREE* tree, RB_TREE_NODE* node);
void rb_tree_delete(RB_TREE* tree, RB_TREE_NODE* node);
#endif /* RB_TREE_H_ */
#include "rb-tree.h"
#include <stdlib.h>
#include <stdio.h>
#define BLACK 0
#define RED 1
RB_TREE* rb_tree_create()
{
RB_TREE* tree;
tree = (RB_TREE*)malloc(sizeof(RB_TREE));
tree->nil = (RB_TREE_NODE*)malloc(sizeof(RB_TREE_NODE));
tree->nil->color = BLACK;
tree->nil->p = NULL;
tree->nil->left = NULL;
tree->nil->right = NULL;
tree->root = tree->nil;
return tree;
}
RB_TREE_NODE* rb_tree_find(RB_TREE* tree, unsigned long long key)
{
RB_TREE_NODE* node;
node = tree->root;
while(node != tree->nil)
{
if(node->key == key)
break;
if(node->key > key)
node = node->left;
else
node = node->right;
}
return node;
}
void rb_tree_left_rotate(RB_TREE* tree, RB_TREE_NODE* node)
{
RB_TREE_NODE* y = node->right;
node->right = y->left;