紅黑樹性質
(1)每個節點非黑及紅
(2)根是黑色
(3)每一片葉子是黑色
(4)若一節點為紅,則其孩子為黑色
(5)對每個節點,所以從該節點到後代葉子的路徑含有同樣多的黑色節點
插入乙個節點的時間複雜度o(lgn)
刪除乙個節點的時間複雜度o(lgn)
rbtree.h
typedef enum color;
typedef struct rbnode
node;
node *create_node(void *key, int size); //建立節點
int clear_node(node *, void(*proc)(void *)); //清理節點
typedef struct
rbtree;
rbtree *create_tree(int size, int(*comp)(void *, void *));
int clear_tree(rbtree *tree, void(*proc)(void *));
int inorder_tree(rbtree *tree, void(*proc)(void *));
rbtree *rbmini(rbtree *tree);
rbtree *rbmax(rbtree *tree);
node *rbsearch(rbtree *tree, void *key);
void rbinsert(rbtree *tree, void *key);
node *rbdelete(rbtree *tree, node *x);
rbtree.c
node *create_node(void *key, int size)
x->key = (void *)malloc(size);
if (null == x->key)
memcpy(x->key, key, size);
x->parent = null;
x->left = null;
x->right = null;
x->color = red;
return x;
}int clear_node(node *x, void(*proc)(void *))
free(x->key);
return 0;
}static node nil = ;
rbtree *create_tree(int size, int(*comp)(void *, void *))
tree->count = size;
tree->nil = &nil;
tree->root = tree->nil;
tree->comp = comp;
tree->create_node = create_node;
tree->clear_node = clear_node;
return tree;
}int clear_tree(node *x, void(*proc)(void *))
static int inorder(node *x, void(*proc)(void *))
int inorder_tree(rbtree *tree, void(*proc)(void *))
node *rbsearch(rbtree *tree, void *key)
if (r == tree->nil)
r = &nil;
return r;
}static node *_rbmini(node *n)
return n;
}node *rbmini(rbtree *tree)
static node *_rbmax(node *n)
node *rbmax(rbtree *tree)
static void rb_rotate_left(node *x, rbtree *tree)
static void rb_rotate_right(node *y, rbtree *tree)
static void insert_fixup(rbtree *tree, node *z)
else
//z的叔叔是黑色,且z是parent的右節點
//z的父節點設為黑色,祖父節點設為紅色,對祖父節點進行右旋轉
z->parent->color = black;
z->parent->parent->color = red;
rb_rotate_right(z->parent->parent, tree);
}} else
else
z->parent->color = black;
z->parent->parent->color = red;
rb_rotate_left(z->parent->parent, tree);
}} }
tree->root->color = black;
}void rbinsert(rbtree *tree, void *data)
z->parent = y;
if (y == tree->nil)
tree->root = z;
else if (comp(z->key, y->key) < 0)
y->left = z;
else
y->right = z;
z->left = tree->nil;
z->right = tree->nil;
z->color = red;
insert_fixup(tree, z);
}node *tree_successor(node *r)
return y;
}static void delete_fixup(rbtree *tree, node *x)
if (black == w->left->color && black == w->right->color)
else
//兄弟節點的左子節點為黑色
//w顏色設為root的顏色,對x父節點左旋轉
w->color = x->parent->color;
x->parent->color = black;
if (w != tree->nil)
w->right->color = black;
rb_rotate_left(tree, x->parent);
x = tree->root;
}} else
if (black == w->right->color && black == w->left->color)
else
w->color = x->parent->color;
x->parent->color = black;
if (w != tree->nil)
w->left->color = black;
rb_rotate_right(tree, x->parent);
x = tree->root;
}} }
x->color = black;
}node *rbdelete(rbtree *tree, node *x)
紅黑樹下 紅黑樹的實現
1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...
紅黑樹下 紅黑樹的實現
1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...
紅黑樹實現
紅黑樹 是一棵二叉搜尋樹,它在每個節點上增加了乙個儲存位來表示節點的顏色,可以是red或black。通過對任何一條從根到葉子簡單路徑上的 顏色來約束,紅黑樹保證最長路徑不超過最短路徑的兩倍,因而近似於平衡 由於性質中紅色節點不連續,最短路徑可為全是連續黑結點,最長路徑則由於紅節點不連續,則每間隔乙個...