紅黑樹的實現

2021-07-12 04:09:45 字數 3656 閱讀 8507

紅黑樹性質

(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。通過對任何一條從根到葉子簡單路徑上的 顏色來約束,紅黑樹保證最長路徑不超過最短路徑的兩倍,因而近似於平衡 由於性質中紅色節點不連續,最短路徑可為全是連續黑結點,最長路徑則由於紅節點不連續,則每間隔乙個...