๐ - RBํธ๋ฆฌ ์ญ์
int rbtree_erase(rbtree *t, node_t *z) {
node_t *y = z; // ์ญ์ ํ๋ ค๋ ๋
ธ๋ z๋ฅผ ์ฐ์ y์ ์ ์ฅ.
node_t *x;
color_t y_original_color = y->color; // y์ ์ปฌ๋ฌ๋ฅผ ์ ์ฅ
if (z->left == t->nil){//์ ํจํ ๊ฐ์ ๊ฐ์ง ์์์ด ์ค๋ฅธ์ชฝ์๋ง ํ๋ ์๋ ๊ฒฝ์ฐ
x = z->right; //์ค๋ฅธ์ชฝ ์์์ x์ ๋ด์๋๊ณ
transplant(t, z, z->right); //z์ ์ค๋ฅธ์ชฝ ์์์ z์ ์์น์ ์ด์(transplant)ํ๋ฉด์ z๋ ์ ๊ฑฐ
}else if(z->right == t->nil){//์ ํจํ ๊ฐ์ ๊ฐ์ง ์์์ด ์ผ์ชฝ์๋ง ํ๋ ์๋ ๊ฒฝ์ฐ
x = z->left;
transplant(t, z, z->left); // z์ ์ผ์ชฝ ์์์ z์ ์์น์ ์ด์ํ๋ฉด์ z๋ ์ ๊ฑฐ๋จ
}else{// ์ ํจํ ์์์ด ๋์ธ ๊ฒฝ์ฐ
y = tree_minimum(t,z->right); // y = z์ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์ ์ต์๊ฐ ( z์ successor)
y_original_color = y->color; // ์ญ์ ๋๋ ์ปฌ๋ฌ ์ ์ฅ
x = y->right; // x๋ y์ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ
if (y->parent == z){ // y์ ๋ถ๋ชจ๊ฐ z์ผ๋
x->parent = y; // x์ ๋ถ๋ชจ๋ y -> z๊ฐ ์ญ์ ๋๋ฉด์ y๊ฐ ์ด์ฐจํผ parent์ ์์น๋ก ๊ฐ๊ธฐ ๋๋ฌธ
}else{
transplant(t, y, y->right); // y๋ฅผ ์ญ์ ํ๋ฉด์ y์ ์ค๋ฅธ์ชฝ์ y๋ก ๋ณ๊ฒฝ
y->right = z->right; // y์ ์ค๋ฅธ ์์ = z์ ์ค๋ฅธ ์์
y->right->parent = y; // y์ ์ค๋ฅธ์ชฝ ์์์ ๋ถ๋ชจ = y
}
transplant(t, z, y);//z๋ฅผ ์ญ์ ํ๋ฉด์ y๋ฅผ z์ ์์น๋ก ๋ณ๊ฒฝ
y->left = z->left; // z์ ์ผ์ชฝ ์๋ธํธ๋ฆฌ๋ฅผ y์ ์ผ์ชฝ์ผ๋ก ์ด์
y->left->parent = y;
y->color = z->color;
}
// fix up
if (y_original_color == RBTREE_BLACK){ //์ง์์ง๋ ์์ด ๊ฒ์ ์ผ ๊ฒฝ์ฐ
node_t *brother;
while (x!=t->root && x->color == RBTREE_BLACK){// x๊ฐ ๋ฃจํธ๊ฐ ์๋๊ณ , x์ ์ปฌ๋ฌ๊ฐ ๋ธ๋์ผ๋
if(x == x->parent->left){ // x๊ฐ ์ผ์ชฝ ์์์ผ ๋
brother = x->parent->right; // x์ ํ์
// x ์ ํ์ ๊ฐ RED ์ธ ๊ฒฝ์ฐ
if(brother->color == RBTREE_RED){ // ํ์ ์ ์ปฌ๋ฌ๊ฐ ๋ ๋์ผ๋ case # 1
brother->color = RBTREE_BLACK; // ํ์ ์ ์ปฌ๋ฌ = ๊ฒ์
x->parent->color = RBTREE_RED; // x์ ๋ถ๋ชจ์ ์ปฌ๋ฌ = ๋นจ๊ฐ
left_rotate(t, x->parent); // ๋ถ๋ชจ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ ํ์
brother = x->parent->right; // ํ์ฌ๋ x๋ถ๋ชจ์ ์ค๋ฅธ์ชฝ
}
// X์ ํ์ ๋ BLACK์ด๊ณ ํ์ ์ ๋ ์์์ด ๋ชจ๋ BLACK์ธ ๊ฒฝ์ฐ
if(brother->left->color == RBTREE_BLACK && brother->right->color==RBTREE_BLACK){ // ํ์ ์ ์ผ์ชฝ ์์ด ๊ฒ์ ์ด๊ณ ํ์ ์ ์ค๋ฅธ์ชฝ ์ปฌ๋ฌ๊ฐ ๊ฒ์ ์ผ๋ case # 2
brother->color = RBTREE_RED; // ํ์ ์ ์ปฌ๋ฌ = ๋นจ๊ฐ
x = x->parent; // x๋ x์ ๋ถ๋ชจ
// X์ ํ์ ๋ BLACK, ํ์ ์ ์ผ์ชฝ ์์์ RED, ํ์ ์ ์ค๋ฅธ์ชฝ ์์์ BLACK์ธ ๊ฒฝ์ฐ
}else{
if(brother->right->color == RBTREE_BLACK){ //ํ์ ์ ์ค๋ฅธ์ชฝ ์ = ๊ฒ์ case # 3
brother->left->color = RBTREE_BLACK; // ํ์ ์ ์ผ์ชฝ ์ = ๊ฒ์
brother->color = RBTREE_RED; // ํ์ ์ ์ปฌ๋ฌ = ๋นจ๊ฐ
right_rotate(t, brother); // ์ค๋ฅธ์ชฝ ํ์
brother = x->parent->right; // ํ์ = x์ ๋ถ๋ชจ์ ์ค๋ฅธ์ชฝ์์
}
// X์ ํ์ ๋ BLACK์ด๊ณ ํ์ ์ ์ค๋ฅธ์ชฝ ์์์ RED์ธ ๊ฒฝ์ฐ
brother->color = x->parent->color; // ํ์ ์ ์ = x์ ๋ถ๋ชจ์ ์ case # 4
x->parent->color = RBTREE_BLACK;
brother->right->color = RBTREE_BLACK;
left_rotate(t, x->parent);
x = t->root;
}
}else{
//์ค๋ฅธ์ชฝ ์ผ์ด์ค ( ์ผ์ชฝ, ์ค๋ฅธ์ชฝ๋ง ๋ฐ๋๊ณ ๋์ผํจ)
brother = x->parent->left;
if(brother->color == RBTREE_RED){
brother->color = RBTREE_BLACK;
x->parent->color = RBTREE_RED;
right_rotate(t, x->parent);
brother = x->parent->left;
}
if(brother->right->color == RBTREE_BLACK && brother->left->color==RBTREE_BLACK){
brother->color = RBTREE_RED;
x = x->parent;
}else{
if(brother->left->color == RBTREE_BLACK){
brother->right->color = RBTREE_BLACK;
brother->color = RBTREE_RED;
left_rotate(t, brother);
brother = x->parent->left;
}
brother->color = x->parent->color;
x->parent->color = RBTREE_BLACK;
brother->left->color = RBTREE_BLACK;
right_rotate(t, x->parent);
x = t->root;
}
}
}
x->color = RBTREE_BLACK;
}
free(z);
return 0;
// erase ๋
}
๐ - RBํธ๋ฆฌ ๊ต์ฒด
// ์ด์ํ๋ ํจ์
// ์๋ธ ํธ๋ฆฌ ์ด๋์ ์ํด ๋
ธ๋๊ฐ u๊ฐ ๋ฃจํธ์ธ ์๋ธํธ๋ฆฌ๋ฅผ ๋
ธ๋ v๊ฐ ๋ฃจํธ์ธ ์๋ธํธ๋ฆฌ๋ก ๊ต์ฒด
void transplant(rbtree *t, node_t *u, node_t *v){
if (u->parent == t->nil){ // u์ ๋ถ๋ชจ๊ฐ nil ์ฆ, u๊ฐ ๋ฃจํธ๋
ธ๋๋ผ๋ฉด
t->root = v; //v๋ฅผ ํธ๋ฆฌ์ ๋ฃจํธ๋
ธ๋๋ก ์ผ๋๋ค.
}else if(u == u->parent->left){ //u๊ฐ ๋ถ๋ชจ์ ์ผ์ชฝ ์์์ผ ๊ฒฝ์ฐ
u->parent->left = v; //v๋ฅผ ์ผ์ชฝ ์์์ผ๋ก ์ด์ (u๋ฅผ ๋์ฒด)
}else{ //์ค๋ฅธ์ชฝ ์์์ผ ๊ฒฝ์ฐ
u->parent->right = v; //v๋ฅผ ์ค๋ฅธ์ชฝ ์์์ผ๋ก ์ด์
}
v->parent = u->parent;
}
๐ - RBํธ๋ฆฌ ์ต์, ์ต๋, ์๋ธ๋ฃจํธ์ ์ต์๊ฐ
node_t *rbtree_min(const rbtree *t) { // ์ต์๊ฐ ๋ฐํ
// TODO: implement find
node_t *min_node = t->root; // t->root๋ถํฐ ์์
while (min_node->left != t->nil){ // ์ผ์ชฝ๋
ธ๋๊ฐ nil์ผ๋๊น์ง
min_node = min_node->left;
}
return min_node;
}
node_t *rbtree_max(const rbtree *t) { // ์ต๋๊ฐ ๋ฐํ
// TODO: implement find
node_t *max_node = t->root; // t->root๋ถํฐ ์์
while (max_node->right != t->nil){ // ์ค๋ฅธ์ชฝ ๋
ธ๋๊ฐ nil์ผ๋๊น์ง
max_node = max_node->right;
}
return max_node;
}
node_t *tree_minimum(const rbtree *t, node_t *sub_root){
// TODO: implement find
node_t *r = sub_root;
if (r == t -> nil)
return r;
while (r -> left != t -> nil)
{
r = r -> left;
}
return r;
}
ใ ๋ถ์ด์ด๋ ๋ฌด์์ผ๊น? ์๊ฐ์ด๋ผ๋ค. ๊ฐ๋ฑ, ๋ ผ์, ์ฑ ๋ง, ๋น๋ ๋ถ์, ๊ฒฝ๋ง์ค๋ฌ์ ๋ฑ์ ๋ฌด์์ ๋งํ๋ ๊ฑธ๊น? ์ด๊ฒ๋ค ๋ํ ์๊ฐ์ด๋ผ๋ค. ใ ก๋ฆฌ๊ณ ์ด ์ฌ์ค๋ณด๋ค ์ค์ํ ๊ฒ์ ์ด๋ฐ ์๊ฐ๋ค์ด ์ฐ๋ฆฌ์ ํฉ๋ฆฌ์ ์ ํ ๋ฐ๊นฅ์ ๋์ฌ ์์ ๋์ง. ๊ทธ๋ ๊ทธ๊ฒ๋ค์ ์ ์๋๋ฉด ์ ์ ๋ชจ์ต์ผ๋ก ๋ํ๋๋ค๋ค. ์์ ์ ์ ํ ์์ญ ์์ ์ํ๊ฒ ํ ๋๋ง ์ด ์๊ฐ๋ค์ ๋ฐ๊ฟ ์๊ฐ ์๋ค๋ค. ๊ทธ๋ฌ๋ฉด ๋ฌด์จ ์ผ์ด ์ผ์ด๋๋ ์ฌ๋๋ค์ ํํ๋ก์์ ์ ์งํ ์ ์๋ค๋ค. ใ
-์ํฝํ ํ ์ค, ๋ํ๋ก, 3.3.18b-19
์ฐ๋ฆฌ๋ ์ผ ์์ด ์๊ฐ์ ํ๋ค. ์ค๋ ํ๋ฃจ ๋น์ ์ ์ด๋ฐ์ ๋ฐ ์๊ฐ์ ํ์ ๊ฒ์ด๋ค.์๊ฐํ๋ค๊ฐ ์์ฃผ ๋ถ๋ ธ์ ์ฌ๋ก์กํ๋ ๊ฒ์ ๋๋์ง ์์ ์ผ์ด๋ค.
ํ์ง๋ง ์๊ฐ์ ๋์๋ฒ๋ฆฐ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น? ์ก์ด๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ฒ๋ผ ์๊ฐ์ ์๋ฅด๊ณ ์์๋ด์. ์ข๊ฑฐ๋ ๋์๋ค๋ ๋๋์ ์ฌ๋ก์กํ์ง ์์ผ๋ฉด์ ์๊ฐ์ด๋ ํ๋จ์ ๋ฌผ๋ค์ง ์๋ ๊ฒ์ด๋ค. ๋จ์ง ๊ทธ๊ฒ๋ฟ์ด๋ค.
ใ ์ํฝํ ํ ์ค๊ฐ ์ด๋ ๊ฒ ๋งํ๋ค. "์ฐ๋ฆฌ๋ ๋์ํ๋ ๊ธฐ์ ์ ๋ค์ ๋ฐฐ์์ผ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ง์ ๋ํด์๋ ํน๋ณํ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ฌ์ผ ํ๋ค. ์๋ง์ ์ ๋นํ ์ ํ ๋ฐ์์ผ ํ๋ฉฐ, ๊ณต์ต์ ์ฆ์งํ ์ ์๋๋ก ํด์ผ ํ๋ฉฐ, ์ค์ ๊ฐ์น์ ๋ถํฉํ ์ ์๋๋ก ์ ์ํด์ผ ํ๋ค. ใ
-๋ง๋ฅด์ฟ ์ค ์์ฐ๋ ๋ฆฌ์ฐ์ค, ๋ช ์๋ก, 11.37
์ค์ํ ๊ฒ์ ๊ฒฝ์ฒญํ๊ณ ๋ฐฐ์ฐ๋ ค๋ ์์ธ๋ค. ์ฐ๋ฆฌ๋ ์ฌํ์ ์ง์์ ์๊ด์์ด ๋ค๋ฅธ ๋๊ตฐ๊ฐ๋ก๋ถํฐ ๊ธฐ๊บผ์ด ๋ฐฐ์ธ ์ ์์ด์ผํ๋ค.