#define YUMEI_RBTREE_COLOR_BLACK 0
#define YUMEI_RBTREE_COLOR_RED 1
typedef struct yumei_rbtree_s yumei_rbtree_t;
typedef struct yumei_rbtree_node_s yumei_rbtree_node_t;
typedef struct yumei_rbtree_key_s yumei_rbtree_key_t;
struct yumei_rbtree_key_s
{
int key[ 8 ];
};
struct yumei_rbtree_s
{
yumei_rbtree_node_t *root;
yumei_rbtree_node_t *leaf;
int count;
yumei_mem_pool_t *pool;
};
struct yumei_rbtree_node_s
{
yumei_rbtree_node_t *left;
yumei_rbtree_node_t *right;
yumei_rbtree_node_t *parent;
int color;
yumei_rbtree_key_t key;
long data[0];
};
#define yumei_rbtree_black( node ) \
( node )->color = YUMEI_RBTREE_COLOR_BLACK
#define yumei_rbtree_red( node ) \
( node )->color = YUMEI_RBTREE_COLOR_RED
#define yumei_rbtree_is_red( node ) \
( node )->color
#define yumei_rbtree_is_black( node ) \
!( node )->color
yumei_rbtree_t* yumei_rbtree_create()
{
yumei_rbtree_t *tree;
yumei_rbtree_node_t *leaf;
yumei_mem_pool_t *pool;
yumei_mem_buf_t *buf;
int size;
#define YUMEI_RBTREE_POOL_BLOCK_SIZE 1024
#define YUMEI_RBTREE_POOL_BLOCK_NUM 8
pool = yumei_mem_pool_create( YUMEI_RBTREE_POOL_BLOCK_SIZE, YUMEI_RBTREE_POOL_BLOCK_NUM );
if( !pool ){
goto error;
}
size = sizeof( yumei_rbtree_t );
buf = yumei_mem_buf_malloc( pool, size );
if( !buf ){
goto pool_error;
}
tree = buf->data;
size = sizeof( yumei_rbtree_node_t );
buf = yumei_mem_buf_malloc( pool, size );
if( !buf ){
goto pool_error;
}
leaf = buf->data;
tree->root = tree->leaf = leaf;
tree->pool = pool;
tree->count = 0;
yumei_rbtree_black( leaf );
return tree;
pool_error:
yumei_mem_pool_free( pool );
error:
return 0;
}
釋放函數
#define YUMEI_RBTREE_ERROR -1
#define YUMEI_RBTREE_OK 0
int yumei_rbtree_free( yumei_rbtree_t *tree )
{
yumei_mem_pool_t *pool;
if( !tree ){
return YUMEI_RBTREE_ERROR;
}
pool = tree->pool;
yumei_mem_pool_free( pool );
return YUMEI_RBTREE_OK;
}
插入函數:
#define YUMEI_RBTREE_PARAM_ERROR 2
#define YUMEI_RBTREE_KEY_EXIST 3
int yumei_rbtree_insert( yumei_rbtree_t *tree, yumei_rbtree_key_t* key, long data )
{
yumei_rbtree_node_t *node, *leaf, *root, *cur, **temp;
yumei_rbtree_key_t *nkey;
yumei_mem_pool_t *pool;
yumei_mem_buf_t *buf;
int i;
int flag;
int size;
if( !tree || !key ){
return YUMEI_RBTREE_PARAM_ERROR;
}
leaf = tree->leaf;
size = sizeof( yumei_rbtree_node_t );
if( data ){
size += sizeof( long );
}
pool = tree->pool;
if( !pool ){
return YUMEI_RBTREE_ERROR;
}
buf = yumei_mem_buf_malloc( pool, size );
if( !buf ){
return YUMEI_RBTREE_ERROR;
}
node = buf->data;
nkey = &node->key;
i = 8;
while( i-- ){
nkey->key[ i ] = key->key[ i ];
}
if( data ){
node->data = data;
}
node->left = node->right = leaf;
if( !tree->count ){
yumei_rbtree_black( node );
node->parent = 0;
tree->root = node;
return YUMEI_RBTREE_OK;
}
cur = tree->root;
while( 1 ){
for( i = 0; i < 8; ++i ){
flag = key->key[ i ] - cur->key->key[ i ];
if( flag < 0 ){
temp = &cur->left;
break;
}
else if( flag > 0 ){
temp = &cur->right;
break;
}
}
if( !flag ){
return YUMEI_RBTREE_KEY_EXIST;
}
if( leaf == *temp ){
break;
}
cur = *temp;
}
*temp = node;
yumei_rbtree_red( node );
root = tree->root;
while( node != root ){
if( node->parent == node->parent->parent->right ){
cur = node->parent->parent->left;
flag = yumei_rbtree_is_black( cur );
if( flag ){
if( node == node->parent->left ){
node = node->parent;
yumei_rbtree_right_rot( tree, node );
}
yumei_rbtree_black( node->parent );
yumei_rbtree_red( node->parent->parent );
yumei_rbtree_left_rot( tree, node>parent->parent );
}
else{
yumei_rbtree_black( node->parent );
yumei_rbtree_black( cur );
yumei_rbtree_red( cur->parent );
node = cur->parent;
}
}
else{
cur = node->parent->parent->right;
flag = yumei_rbtree_is_black( cur );
if( flag ){
if( node == node->parent->right ){
node = node->parent;
yumei_rbtree_left_rot( tree, node );
}
yumei_rbtree_black( node->parent );
yumei_rbtree_red( node->parent->parent );
yumei_rbtree_right_rot( tree, node->parent->parent );
}
else{
yumei_rbtree_black( node->parent );
yumei_rbtree_black( cur );
yumei_rbtree_red( cur->parent );
node = cur->parent;
}
}
flag = yumei_rbtree_is_black( node->parent );
if( flag ){
break;
}
}
yumei_rbtree_black( root );
return YUMEI_RBTREE_OK;
}
for( i = 0; i < 8; ++i ){
flag = key->key[ i ] - cur->key->key[ i ];
if( flag < 0 ){
temp = &cur->left;
break;
}
else if( flag > 0 ){
temp = &cur->right;
break;
}
}
A: 0x65 0x66 0x67 0x68 0x69 0x70 0x71 0x72
B: 0x65 0x66 0x67 0x68 0x69 0x70 0x72 0x71
用字符串比較要比較7次纔有結果,而用整型只需要2次,用長整型只需要一次,是不是節省了太多時間。