๋ ๋๋ธ๋ ํธ๋ฆฌ(red-black tree)๋ ์ด์ง ๊ฒ์ ํธ๋ฆฌ๋ก์, ๊ฐ ๋ ธ๋๋น ํ ๋นํธ์ ์ถ๊ฐ ๊ธฐ์ต ๊ณต๊ฐ์ ๊ฐ์ง๋ค.
์ด ๋นํธ๋ RED ๋๋ BLACK์ ์๊น์ ๋ํ๋ธ๋ค.
๋ฃจํธ์์ ๋ฆฌํ๊น์ง์ ๊ฒฝ๋ก์ ๋ํ๋๋ ๋
ธ๋์ ์๊น์ ์ ํํจ์ผ๋ก์จ, ํธ๋ฆฌ์ ๊ท ํ์ ๊ทผ์ฌ์ ์ผ๋ก ์ ์งํ๋ค.
๋ค์ 5๊ฐ์ ๋ ๋๋ธ๋ ํน์ฑ์ ๋ง์กฑํ๋ ์ด์ง ๊ฒ์ ํธ๋ฆฌ๋ฅผ ๋ ๋๋ธ๋ ํธ๋ฆฌ๋ผ๊ณ ํ๋ค.
- ๋ชจ๋ ๋ ธ๋๋ ์ ์์ด๊ฑฐ๋ ํ์์ด๋ค.
- ๋ฃจํธ๋ ํ์์ด๋ค.
- ๋ชจ๋ ๋ฆฌํ(NIL)๋ ํ์์ด๋ค.
- ๋ ธ๋๊ฐ ์ ์์ด๋ฉด ๊ทธ ๋ ธ๋์ ์์์ ๋ชจ๋ ํ์์ด๋ค.
- ๊ฐ ๋ ธ๋๋ก๋ถํฐ ๊ทธ ๋ ธ๋์ ์์์ธ ๋ฆฌํ๋ก ๊ฐ๋ ๊ฒฝ๋ก๋ค์ ๋ชจ๋ ๊ฐ์ ์์ ํ์ ๋ ธ๋๋ฅผ ํฌํจํ๋ค.
๊ฒฝ๊ณ ๋ ธ๋.
์ผํฐ๋ ๋ ธ๋๋ฅผ ํ์ฉํ๋ฉด ๊ฐ์ ํธ๋ฆฌ๋ (b)์ฒ๋ผ ๊ตฌํํ ์ ์๋ค.
NULL pointer can โas in all binary tree data structuresโ encode the fact that there is no child node at this position in the (parent) node.
์ถ์ฒ: https://en.wikipedia.org/wiki/Red%E2%80%93black_tree#req3
์ ์๊ฐํด๋ณด๋ฉด ๊ตณ์ด ์ผํฐ๋ ๋ ธ๋๋ฅผ ์จ์ผํ ๊น ํ๋ ์๋ฌธ์ด ๋ค ์ ์๋ค. ๊ทธ๋ฆผ (a)์์ ๋ณด์ด๋ NIL์ ์ค์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋๋ ๋ ธ๋๊ฐ ์๋ NULL๋ก ๋ฐ๊ฟ์(key๋ฅผ ๊ฐ์ง ๋ ธ๋ ์ค ๊ฐ์ฅ ๋ ๋ ธ๋๋ค์ ์์ ํฌ์ธํฐ๋ค์ NULL์ ๊ฐ๋ฆฌํค๊ฒ ํด์) ์๊ฐํด๋ ํธ๋ฆฌ์ ๊ตฌ์กฐ์๋ ๋ฌธ์ ๊ฐ ์๋ค. ๊ทธ๋ ๋ค๋ฉด ์ผํฐ๋ ๋ ธ๋๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ตณ์ด ํ ๋นํด์ (ํธ๋ฆฌ์์ ๋ฑ ํ๋์ด๊ธด ํ์ง๋ง.) ๊ตฌํํด์ผํ ์ด์ ๊ฐ ์์ ๊ฒ์ด๋ค.
๊ทธ๋ผ์๋ ์ผํฐ๋ ๋ ธ๋๋ฅผ ์ฌ์ฉํ์ ๋์ ์ด์ ์ ์ด๋ฆ์์๋ ๊ทธ๋๋ก ๋๋ฌ๋๋ฏ '๊ฒฝ๊ณ๊ฐ ์ฒ๋ฆฌ์ ์ ์ฉํจ'์ ์๋ค. ๋ฆฌํ๋ ธ๋(์ด ๋ฌธ์ฅ์์๋ key๋ฅผ ๊ฐ์ง ๋ ธ๋ ์ค ๊ฐ์ฅ ๋ ๋ ธ๋๋ค)๋ฅผ ์ญ์ ํ ๋๋ฅผ ์๊ฐํด๋ณด์.
NULL ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ ๊ตฌํ์์๋ ๋ฆฌํ๋ ธ๋๋ฅผ ์ญ์ ํ ๋ ์กฐ๊ฑด๋ฌธ์ ์ค์ ๋ฐ๋ก ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผ ํ๋ค. ์ญ์ ํ๊ณ ์ ํ๋ ๋ ธ๋๊ฐ u, ๊ทธ ๋ถ๋ชจ๋ u.p, u์ ์์์ v๋ผ๊ณ ํ๋ค๋ฉด, u์ ์๋ฆฌ๊ฐ ์์ด์ง๊ธฐ ๋๋ฌธ์ u.p์ v๋ฅผ ์ด์ด์ ํธ๋ฆฌ๊ฐ ๋๊ธฐ์ง ์๊ฒ ํด์ผํ ๊ฒ์ด๋ค. ์ด๋ฅผ ๊ตฌํํ๊ธฐ ์ํด (1) u.p ์์์ v๋ก ์ค์ ํ๊ณ , (2) v์ ๋ถ๋ชจ๋ฅผ u.p๋ก ์ค์ ํ๋ ๊ณผ์ ์ด ํ์ํ๋ค(ํฌ์ธํฐ๋ ํ์ชฝ ๋ฐฉํฅ๋ง ๋ณผ ์ ์๊ธฐ ๋๋ฌธ.) u๊ฐ ๋ฆฌํ๋ ธ๋๊ฐ ์๋๋ผ๋ฉด u.p, v ๋๋ค ์กด์ฌํ๊ฒ ์ง๋ง, ๋ฆฌํ๋ ธ๋๋ผ๋ฉด v๋ ์กด์ฌํ์ง ์๋๋ค. (u์ ์์ ํฌ์ธํฐ๋ NULL์ ๊ฐ๋ฆฌํจ๋ค). ๊ทธ๋์ ๋ฆฌํ๋ ธ๋๋ ์์ (2)๊ณผ์ ์ ์ํํ ์ ์๋ค. ๋ฐ๋ผ์ ์กฐ๊ฑด๋ฌธ์ด ํ๋ ํ์ํ ๊ฒ์ด๋ค.
// using NULL pointer
void rbtree_transplant(rbtree *t, node_t *u, node_t *v){
if (u->parent == null) {
t->root = v;
}
else if (u == u->parent->left) {
u->parent->left = v;
} else {
u->parent->right = v;
}
if (v != null) { // v๊ฐ null์ด ์๋๋ผ๋ ์กฐ๊ฑด == u๊ฐ ๋ฆฌํ๋
ธ๋๊ฐ ์๋.
v->parent = u->parent;
}
}
ํ์ง๋ง ์ผํฐ๋ ๋ ธ๋๋ฅผ ์ฌ์ฉํ ๊ตฌํ์์๋ ๋ฆฌํ๋ ธ๋ ์์ ์ฒดํฌํ์ง ์์๋ ๋๋ค. ์๋ํ๋ฉด ๋ฆฌํ๋ ธ๋(์ด ๋ฌธ์ฅ์์๋ key๋ฅผ ๊ฐ์ง ๋ ธ๋ ์ค ๊ฐ์ฅ ๋ ๋ ธ๋๋ค)์ ์์์ T.nil์ด๋ผ๋ '๋ ธ๋'๋ก '์กด์ฌ'ํ๊ธฐ ๋๋ฌธ์ด๋ค.
// using Sentinel Node
void rbtree_transplant(rbtree *t, node_t *u, node_t *v){
if (u->parent == t->nil) {
t->root = v;
}
else if (u == u->parent->left) {
u->parent->left = v;
} else {
u->parent->right = v;
}
v->parent = u->parent; // ์กฐ๊ฑด๋ฌธ ์์ด ๊ตฌํ ๊ฐ๋ฅ.
}
์์ฃผ ๋ฏธ๋ฏธํ ์ฐจ์ด์ด๊ธด ํ๋ ์ ์ฒด ์ฐ์ฐ์๊ฐ์์ ์์์ธ์๋ฅผ ์ค์ผ ์ ์๊ณ , ์ฝ๋๊ฐ ๋ ๋ช ํํด์ง๋ค๋ ์ด์ ์ ์ป์ ์ ์๋ค. ๋จ, ์ด ์ญ์ trade-off๊ฐ ์๋ค. ๋ง์ฝ ์์์ ๊ฐ์๊ฐ ์ ์ 'ํธ๋ฆฌ(ํน์ ๋ฆฌ์คํธ)๊ฐ ์ฌ๋ฌ๊ฐ ์๋ ๊ฒฝ์ฐ', ์ผํฐ๋๋ ธ๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ์ฉ์ ๋ญ๋น๊ฐ ๋ ์ ์๋ค.
RB-tree ๋ง๊ณ ๋, ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํด ๋งํฌ๋ฅผ ๊ตฌํํ๋ ๋ค๋ฅธ ์๋ฃ๊ตฌ์กฐ์์ ๋ํ ๊ฐ์ ์๋ฆฌ๋ก ์ผํฐ๋ ๋ ธ๋์ ์ด์ ์ ํ์ฉํ ์ ์๋ค. ์๋๋ ๋๋ธ ๋งํฌ๋ ๋ฆฌ์คํธ์ ์ญ์ ์ฐ์ฐ์ ๋ํ ์ฝ๋์ด๋ค. ๋ง์ฐฌ๊ฐ์ง์ ์๋ฆฌ๋ก ๊ฒฝ๊ณ๊ฐ (๋ฆฌ์คํธ์ ์ฒซ์ฌ๊ฐ๊ณผ ๋๊ฐ)์ ๋ํ ์กฐ๊ฑด๋ฌธ์ด ์ผํฐ๋ ๋ ธ๋๋ฅผ ์ฌ์ฉํ ๋๋ ํ์์์ด์ง๋ค.
// first and last are used to hold the address of first and last node.
// Using NULL and pointers for first and last
if (n->prev) n->prev->next = n->next;
else first = n->next;
if (n->next) n->next->prev = n->prev;
else last = n->prev;
// Using the dummy node
n->prev->next = n->next;
n->next->prev = n->prev;
์ถ์ฒ : https://stackoverflow.com/questions/5384358/how-does-a-sentinel-node-offer-benefits-over-null
ํน์ฑ ๋ณต๊ตฌ ์ ์ฌ์ฉ.
LEFT-ROTATE
์ RIGHT-ROTATE
๊ฐ ์๋๋ฐ ์๋ก ๋์นญ์ด๋ค.
LEFT-ROTATE(T,x)
y = x.right // "y๋ x์ ์ค๋ฅธ์ชฝ ์์์ ๋งํ๋ค."
x.right = y.left // x์ ์งํ ๊ฐ, ๊ทธ๋ฆผ์์๋ ฮฒ๋ฅผ x๊ฐ ์ค๋ฅธ์ชฝ ์์์ผ๋ก ๊ฐ์ ธ๊ฐ๋ ๊ตฌ๊ฐ.
if y.left != T.nil
y.left.p = x
y.p = x.p // y๊ฐ x์๋ฆฌ์ ์ค๊ฒ๋๋ ๊ตฌ๊ฐ.
if x.p == T.nil
T.root = y
else if x == x.p.left
x.p.left = y
else // x == x.p.right
x.p.right = y
y.left = x // x๊ฐ y์ ์ผ์ชฝ์์์ด ๋๋ ๊ตฌ๊ฐ.
x.p = y
์ฝ์
๋๋ ๋
ธ๋ Z์ ๋ํ์ฌ,
Z๋ฅผ ์ฝ์
ํ๊ณ (๊ธฐ๋ณธ ์ด์งํธ๋ฆฌ์ ์ฝ์
๊ณผ์ ๊ณผ ๊ฐ๋ค.) ์ ์์ผ๋ก ์น ํ๋ค (RB-INSERT
).
์ดํ์ ๋ฐ์ํ ์ ์๋ ์๋ฐ์ ๋ณต๊ตฌํ๋ค (RB-INSERT-FIXUP
).
RB-INSERT-FIXUP
์ ์๋ ๋ฐ๋ณต๋ฌธ์ด ์คํ๋๋ฉด์, Z๊ฐ ๊ฐ๋ฆฌํค๋ ๋
ธ๋๋ ์๋ก ์ฌ๋ผ๊ฐ๋ค.
๋ฐ์ ๊ฐ๋ฅํ ์๋ฐ์ ์๋์ ๋๊ฐ์ง์ธ๋ฐ, ๋๊ฐ์ง๋ฅผ ํ๊บผ๋ฒ์ ์๋ฐํ์ง๋ ์๋๋ค.
- ํน์ฑ 4 ์๋ฐ : "๋ ธ๋๊ฐ ์ ์์ด๋ฉด ๊ทธ ๋ ธ๋์ ์์์ ๋ชจ๋ ํ์์ด๋ค."
Z๊ฐ ์ ์์ผ๋ก ์ฝ์ ๋ ์ํฉ์์, Z์ ์ฝ์ ์์น ์์ ๋ถ๋ชจ๊ฐ ์ ์์ด๋ฉด ํน์ฑ 4๋ฅผ ์๋ฐํ๊ฒ ๋ ๊ฒ์ด๋ค.- ํน์ฑ 2 ์๋ฐ : "๋ฃจํธ๋ ํ์์ด๋ค."
Z๊ฐ ๊ฐ๋ฆฌํค๋ ๋ ธ๋๋ ํญ์ ์ ์์์ ์๊ธฐํ์.
(RB-INSERT
์์๋ ์ ์์ผ๋ก ์น ํ๊ณ ,RB-INSERT-FIXUP
์ ๋ฐ๋ณต๋ฌธ ์์์๋ ์ดํ ๋ฐ๋ณต์์ Z๊ฐ ๊ฐ๋ฆฌํค๊ฒ๋ ๋ ธ๋๋ฅผ ์ ์์ผ๋ก ์น ํ๋ค.)
๋ฐ๋ผ์, ๋งจ ์ฒ์ ์ฝ์ ์์ Z๊ฐ ๋ฃจํธ์์น์ ์๊ฑฐ๋ (๋น ํธ๋ฆฌ์์ ๋),
RB-INSERT-FIXUP
๋ด์ ๋ฐ๋ณต๋ฌธ ์งํ๋๋ฉด์ Z๊ฐ ๋ฃจํธ๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋ ๋ ์๋ฐ๋ ๊ฒ์ด๋ค.
์ ์ฒด์ ์ธ ๊ตฌ์กฐ๋ RB-INSERT-FIXUP
์ ๋ฐ๋ณต๋ฌธ ์์์ ํน์ฑ 4๊ฐ ๋ณต๊ตฌ๋๊ณ ,
๋ฐ๋ณต๋ฌธ์ ๋น ์ ธ ๋์จ ํ ๋ค์ ๋ผ์ธ์์ ํน์ฑ 2๊ฐ ๋ณต๊ตฌ๋ ์ ์๋ค.
์ฝ๋๋ฅผ ๋จผ์ ๋ณด์.
RB-INSERT
๋ ์ด์งํธ๋ฆฌ์ ์ฝ์
๊ณผ์ ๊ณผ ๊ฑฐ์ ๋ค๋ฅด์ง ์๋ค. ๋ค๋ง ๋ฆฌํ๋
ธ๋์ ์์์ T.nil๋ก ์ค์ ํด์ค์ผํ๊ณ , Z๋ฅผ ์ฝ์
ํ ์ ์์ผ๋ก ์น ํด์ฃผ์ด์ผ ํ๋ค.
RB-INSERT(T,z)
/*
์ผ๋ฐ ์ด์งํธ๋ฆฌ์ ์ฝ์
๊ณผ์ ๊ณผ ๋์ผ.
*/
// RB-INSERT์ ์ฐจ์ด์ .
z.left = T.nil // ๋ฆฌํ๋
ธ๋์ ์์์ T.nil๋ก ์ค์ ํด์ค์ผํ๊ณ ,
z.right = T.nil //
z.color = RED // Z๋ฅผ ์ฝ์
ํ ์ ์์ผ๋ก ์น ํด์ฃผ์ด์ผ ํ๋ค.
RB-INSERT-FIXUP(T,z) // ์ฝ์
ํ ์๋ฐ๋ ํน์ฑ์ ๋ณต๊ตฌํด๋ณด์.
RB-INSERT-FIXUP(T,z)
while z.p.color == RED
if z.p == z.p.p.left
y = z.p.p.right // "y๋ z์ ์ผ์ด"
if y.color == RED // ๊ฒฝ์ฐ 1 : ์ผ์ด์ด ์ ์. (๋ถ๋ชจ z.p๋ ์ด๋ฏธ ์ ์)
z.p.color = BLACK
y.color = BLACK
z.p.p.color = RED
z = z.p.p // z๋ฅผ ์กฐ๋ถ๋ชจ๋ก ๋๊ณ while๋ฌธ ๋ฐ๋ณต.
else // ๊ฒฝ์ฐ 2,3 : ์ผ์ด์ด ํ์.
if z == z.p.right // ๊ฒฝ์ฐ 2 : ์ผ์ด์ด ํ์์ด๊ณ , z๋ ๋ถ๋ชจ์ ์ค๋ฅธ์ชฝ ์์.
z = z.p // ๊ฒฝ์ฐ 3๊ฐ ๋๊ธฐ ์ํด(=์ผ์ชฝ์์์ด ๋๊ธฐ์ํด) ํ์ ํ๊ธฐ์ ๋ฏธ๋ฆฌ zํฌ์ธํฐ๋ฅผ ์กฐ์
LEFT-ROTATE(T,z)
z.p.color = BLACK // ๊ฒฝ์ฐ 3 : ์ผ์ด์ด ํ์์ด๊ณ z๋ ๋ถ๋ชจ์ ์ผ์ชฝ ์์.
z.p.p.color = RED
RIGHT-ROTATE(T,z.p.p)
else
/*
์์ ๋์นญ. (z.p == z.p.p.right์ธ ๊ฒฝ์ฐ์ด๋ฏ๋ก.)
*/
T.root.color = BLACK // ๋ฐ๋ณต๋ฌธ ๋น ์ ธ๋์์(ํน์ ์ฒจ๋ถํฐ ์คํ์ด ์๋์) ํน์ฑ 2 ์๋ฐ ์์ ๊ฒฝ์ฐ์ ๋๋น.
๋ฐ๋ณต๋ฌธ ์์ ๋ค์ด์๋ ๊ฒฝ์ฐ 1,2,3 ์ ํน์ฑ 4 ์๋ฐ์ ๋ณต๊ตฌํ๊ธฐ ์ํ ์ผ์ด์ค๋ค.
๊ฒฝ์ฐ 1 : ์ผ์ด์ด ์ ์์ธ ๊ฒฝ์ฐ.
๊ฒฝ์ฐ 2 : ์ผ์ด์ด ํ์์ด๊ณ , z๊ฐ ๋ถ๋ชจ์ ์ค๋ฅธ์ชฝ ์์์ผ ๊ฒฝ์ฐ.
๊ฒฝ์ฐ 3 : ์ผ์ด์ด ํ์์ด๊ณ , z๊ฐ ๋ถ๋ชจ์ ์ผ์ชฝ ์์์ผ ๊ฒฝ์ฐ.
(์ฌ๊ธฐ์์ ๊ฒฝ์ฐ 2,3์ z์ ๋ถ๋ชจ๊ฐ ์ผ์ชฝ ์์์ผ ๊ฒฝ์ฐ์.)
๊ฒฝ์ฐ 1์ ๋ฐ๋ณต๋ฌธ ์คํ ํ ๋ค์ ๊ฒฝ์ฐ 1์ด ๋๊ฑฐ๋, ๊ฒฝ์ฐ 2,3์ผ๋ก ๋ฐ๋๋ค.
๊ฒฝ์ฐ 2,3์ ๋ฐ๋ณต๋ฌธ ์คํํ ๋ฐ๋ณต์ด ์ข
๋ฃ๋๋ค.
RIGHT-ROTATE
ํ๋ฉด ์๋ฐ์ด ์ฌ๋ผ์ง๋ค.LEFT-ROTATE
ํด์ ๊ฒฝ์ฐ 3์ ๋ชจ์๊ณผ ๊ฐ๊ฒ ๋ง๋ค๊ณ ์ดํ์๋ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์๋ฐ์ ์์ ๋ฉด ๋๋ค.๋จผ์ ๊ธฐ๋ณธ ์ด์งํธ๋ฆฌ์ ์ญ์ ๋ ๋๊ฐ์ง ์ข ๋ฅ๊ฐ ์๋ค. ์ญ์ ํ๊ณ ์ ํ๋ ๋ ธ๋๋ฅผ Z๋ผ๊ณ ํ์.
- Z๊ฐ ํ๋ '์ดํ'์ ์์์ ๊ฐ์ง๊ณ ์์ ๊ฒฝ์ฐ, ๊ทธ ์์๋ ธ๋๊ฐ Z์ ์๋ฆฌ๋ฅผ ๋์ ํ๋ฉด ๋๋ค.
์๋๋ ๊ทธ ํ๋์ ์์๋ ธ๋๊ฐ ์ผ์ชฝ ์ค๋ฅธ์ชฝ์ด๋์ ์ฐจ์ด์ผ ๋ฟ.- Z๊ฐ ๋๊ฐ์ ์์์ ๊ฐ์ง ๊ฒฝ์ฐ, Z์ ์งํ์์ Y๋ฅผ ์ฐพ๊ณ ๊ทธ ๋ ธ๋๊ฐ Z์ ์๋ฆฌ๋ฅผ ๋์ ํ๊ฒ ํ๋ฉด ๋๋ค. ๋ค๋ง Z์ '์งํ์์'๋, ํธ๋ฆฌ ์ ์ฒด์ ์์์ key์์์์์ ๋ฐ๋ก ๋ค์ ์์๋ฅผ ์๋ฏธํ๋ค.
๊ทธ๋์ ์๋์ ๊ฐ์ ๋๊ฐ์ง ๊ฒฝ์ฐ๋ก ๋๋ ์ ์๋ค.
(c) : ์งํ์์ Y๊ฐ ๋ฐ๋ก ๋ฐ ์์์ธ ๊ฒฝ์ฐ. - ํ ๋ฒ์ ์ด์(transplant
)์ด ํ์
(d) : ์งํ์์ Y๊ฐ ๋ฐ๋ก ๋ฐ ์์์ด ์๋๊ฒฝ์ฐ. - ๋ ๋ฒ์ ์ด์์ด ํ์
RB-TRANSPLANT()
๋ ๋ง๊ทธ๋๋ก ์ญ์ ๋ ๋ ธ๋ ์์น์ ๋์ฒดํ ๋ ธ๋๋ฅผ '์ฎ๊ฒจ์ฌ๋' ํจ์์ด๋ค.
๋ ๋๋ธ๋ ํธ๋ฆฌ์ ์ญ์ ๊ณผ์ ๋ํ ๊ธฐ๋ณธ ์ด์งํธ๋ฆฌ์ ์ญ์ ๊ณผ์ ๊ณผ ๊ฑฐ์ ์ ์ฌํ๋ค.
๋จ, ์ญ์ ํ๋ ๊ณผ์ ์์ ๋
ธ๋๋ค์ ์์น๊ฐ ๋ฐ๋๊ณ , ๊ทธ์ ๋ฐ๋ฅธ ์ ์ฒด์ ์ธ ์ ๋ฐฐ์ด ๋ํ ๋ฐ๋ ์ ์๋ค.
์ด ๊ณผ์ ์์ ์๋ฐ์ด ์๊ธธ ์ ์๋๋ฐ, ์ด๋ฌํ ์ํฉ์ ๋๋นํด ์ญ์ ํ ๋
ธ๋์ ์๋ ์์น๋ฅผ ์ฑ์ฐ๋ ๋
ธ๋๋ค์ ์ถ์ ํ๋ฉด์ ์๋ฐ์ ํ์งํ๊ณ ๋ณต๊ตฌํ๋ค.
์ด๋ฅผ ์ํด Z๊ฐ ์ญ์ ๋ ์๋ฆฌ๋ฅผ ์ฑ์ฐ๋ ๋
ธ๋๋ฅผ Y๋ก ์ค์ ํ๋ค.
๊ทธ๋ฆฌ๊ณ Y๊ฐ ์ด๋ํ๋ฉด์ ์๋ Y์ ๋น์๋ฆฌ๋ฅผ ์ฑ์ฐ๋ ๋
ธ๋ ๋ํ ์กด์ฌํ ๊ฒ์ด๋ค. ๊ทธ ๋
ธ๋๋ฅผ X๋ก ์ค์ ํ๋ค.
์์ 2๋ฒ์ (c),(d)์์ ๋ณด์ด๋ฏ์ด, Z์ ์๋ ์์น์ Y๊ฐ ๋ค์ด๊ฐ๊ณ , Y์ ์๋ ์์น์ X๊ฐ ๋ค์ด๊ฐ๋ค.
์ด ๊ฒฝ์ฐ๋ฅผ Y๋ ์ด๋ํ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํด
์ด๋ผ๊ณ ํํํ ๊ฒ์ด๋ค.
๋ค๋ง, 1๋ฒ์ ๊ฒฝ์ฐ์๋ ๋ค์์ ๋ฑ์ฅํ ๋ฐ๋ณต๋ฌธ์์์ ๋ณ์์ ๋ฒ์ฉ์ฑ์ ์ํด, Y๊ฐ ๋ฐ๋ก Z์ ์๋ฆฌ๋ฅผ ์ฑ์ด ํ(๋ฎ์ด์์ด๋ค๊ณ ์๊ฐํ์) ๋ฐ๋ก ์ญ์ ๋๋ค. ๊ทธ ํ ๊ทธ ์๋ฆฌ๋ฅผ X๊ฐ ์ฑ์ด๋ค.
์ด ๊ฒฝ์ฐ๋ฅผ Y๋ ์ญ์ ๋ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํด
์ด๋ผ๊ณ ํํํ ๊ฒ์ด๋ค.
์์ ์ธ๊ธ ํ๋ฏ, ์ด๋ฌํ ์ถ์ ์ ์๋ฏธ๋ ๋ฐ๋ ์ ๋ฐฐ์ด์ด ์ ๋ฐํ๋ ์๋ฐ์ ๋ฐ๋ก์ก๊ธฐ ์ํจ์ด๋ค.
์ด๋ ํ ์๋ฐ์ด ๊ฐ๋ฅํ์ง๋ฅผ ์์๋ณด๊ธฐ ์ ์ ์ฝ๋๋ฅผ ๋จผ์ ์ดํด๋ณด์.
RB-DELETE(T,z)
// 1. "Y๊ฐ ์ญ์ ๋ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒฝ์ฐ". ์ฆ, ์ญ์ ๋๋ ๋
ธ๋ Z์ ์์์ด ํ๋์ธ ๊ฒฝ์ฐ.
y = z
y-original-color = y.color // y์ ์๋ ์์ ์ ์ฅํด๋๋ค.
if z.left == T.nil // ๊ทธ ํ๋์ ์์์ด ์ค๋ฅธ์ชฝ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ์๋ฏธ.
x = z.right // ๊ทธ ์์์ x๋ผ๊ณ ๋๊ณ
RB-TRANSPLANT(T,z,z.right) // z์ ์๋์๋ฆฌ(1ํ์์ y๊ฐ ๋.)๋ฅผ ๋์ฒดํจ.
elseif z.right == T.nil // ๊ทธ ํ๋์ ์์์ด ์ผ์ชฝ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ์๋ฏธ.
x = z.left
RB-TRANSPLANT(T,z,z.left)
// 2. "Y๊ฐ ์ด๋ํ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒฝ์ฐ". ์ฆ, ์ญ์ ๋๋ ๋
ธ๋ Z์ ์์์ด ๋๊ฐ์ธ ๊ฒฝ์ฐ.
else
y = TREE-MINIMUM(z.right) // 'y๋ z์ ์งํ์์'. z์ ์ฐ์ธก ์๋ธํธ๋ฆฌ์ ์ต์๊ฐ์ ์ฐพ์ผ๋ฏ๋ก์จ ์ป๋๋ค.
y-original-color = y.color
x = y.right // 'x๋ y์ ์์'. ์๋ธํธ๋ฆฌ์ ์ต์๊ฐ์ ๊ฐ์ง ๋
ธ๋์ด๊ธฐ ๋๋ฌธ์ ์ผ์ชฝ ์์์ด ์๋ค. ๊ทธ๋์ x๋ ๋ฐ๋ก ์ค๋ฅธ์ชฝ ์์์ผ๋ก ์ง์ ํ๋ค.
// y๊ฐ z์ ๋ฐ๋ก ๋ฐ ์์์ผ ๋. ์์ (c)์ ๊ฒฝ์ฐ.
if y.p == z
x.p = y // x๊ฐ T.nil์ผ ๋๋ฅผ ๋๋นํด x.p๋ฅผ ๊ตณ์ด y๋ก ๋ช
์ํด ์ค๋ค. ์๋์์ ์์ธํ ์ค๋ช
.
// y๊ฐ z์ ๋ฐ๋ก ๋ฐ ์์์ด ์๋ ๊ฒฝ์ฐ. ์์ (d)์ ๊ฒฝ์ฐ.
else
// (d)์ ์ค๊ฐ๋จ๊ณ๋ฅผ ๋ง๋๋ ๊ณผ์ ์ด๋ค.
RB-TRANSPLANT(T,y,y.right) // x(y.right)์ y์ ์๋ฆฌ๋ก ์ฎ๊ฒจ ์ฌ์ด์ค๋ค ์ฆ,
// x.p = r ์ ๊ฒฐ๊ณผ๋ฅผ ๋ธ๋ค.
y.right = z.right // r(z.right)์ y์ ์ค๋ฅธ์ชฝ ์์์ผ๋ก ๋ง๋ ๋ค.
y.right.p = y // r์ ๋ถ๋ชจ๋ฅผ y๋ก ๋ง๋ ๋ค.
RB-TRANSPLANT(T,z,y) // y๋ฅผ z์ ์๋ ์๋ฆฌ์ ์ฎ๊ฒจ ์ฌ๋๋ค.
// (d์ ๊ฒฝ์ฐ์)๋ฐ๋ก ์์์ ๋ง๋ ์๋ธํธ๋ฆฌ์ ๋ฃจํธ y๋ฅผ z์ ์๋ฆฌ์ ์ฎ๊ฒจ์ฌ๋ ๋ผ์ธ.
// (c์ ๊ฒฝ์ฐ์)z์ ๋ฐ๋ก ๋ฐ ์์ y๋ฅผ z์ ์๋ฆฌ์ ์ฎ๊ฒจ์ฌ๋ ๋ผ์ธ.
y.left = z.left // ์๋ z์ ์ผ์ชฝ ์์๋ค ์ด์ด๋ฐ๊ธฐ.
y.left.p = y
y.color = z.color // y์ ์์ ์๋ z๊ฐ ์๊ธฐ์๋ฆฌ์์ ๊ฐ๊ณ ์๋ ์์ผ๋ก ๊ฐ์ ํ๋ค.
// ์ด์ ๋, z๊ฐ ์์์ด ํ๋์ผ๋๋ ์๊ด์ด ์์๋๋ฐ, ๋๊ฐ ์ผ๋๋ y๋ง๊ณ ๋ ์ผ์ชฝ ์์์ด ์์์ผ๋ ๊ทธ๋ค๊ณผ์ ์ ๋ฐฐ์ด์ ์ด๊ธ๋์ง ์๊ฒ ํ๊ธฐ ์ํจ์ด๋ค.
// ํ์ง๋ง y์์ ์ด ๋ฃจํธ๋ก ์๋ ์๋ธํธ๋ฆฌ์์๋ y์ ์๊น์ด z์ ์๋์์ผ๋ก ๊ฐ์ ๋นํ์ผ๋(๋ฐ๋์์ผ๋) ์ ๋ฐฐ์ด์ด ์ด๊ธ๋ ์ ์๋ค.
// ์ด ๊ฒ์ ์๋๋ ๊ฒฐ๊ตญ, ์ด๊ธ๋จ์ ๋ฒ์๋ฅผ ์ง๊ธ ์ถ์ ํ๋ ๊ฐ๋ค ์์์ ์ผ์ด๋๊ฒ ์ ํํ ๊ฒ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
if y-original-color == BLACK
RB-DELETE-FIXUP(T,x) // ์๋ฐ์ ๊ณ ์ณ๋ณด์..
... x = y.right // y๊ฐ z์ ๋ฐ๋ก ๋ฐ ์์์ผ ๋. ์์ (c)์ ๊ฒฝ์ฐ. if y.p == z x.p = y ...
์ฌ๊ธฐ์์
x.p = y
์ ์๋ฏธ๋x
๊ฐT.nil
์ผ ๋ ๊ทธT.nil
๋ ธ๋์ ๋ถ๋ชจ๋ฅผ ๊ฐฑ์ ํด์ฃผ๊ธฐ ์ํจ์ด๋ค. ์๋x
์ ๋ถ๋ชจ๋ฅผy
๋ก ์ค์ ํด์ค ํ์๊ฐ ์๋ค. ํด๋น ์ฝ๋์ ๋ฐ๋ก ์ ์ค์์x = y.right
๊ฐ ์คํ๋๊ธฐ ๋๋ฌธ์x
๊ฐy
์ ์์์์ด ๋ช ๋ฐฑํ๊ธฐ ๋๋ฌธ์ด๋ค. ์๋ก insert๋ ๊ฐ๋ ์๋, ์๋ ํธ๋ฆฌ๊ตฌ์กฐ์ ์๋ ์์์ด๋ฏ๋ก ๊ทธ ๋ ธ๋ ์์ ๋ถ๋ชจ ์ ๋ณด๋ ์ ํํ ๋ค์ด์๋ค.
ํ์ง๋งy.right
์ดT.nil
์ด์๋ค๋ฉด,x
์๊ฒ ๋ถ๋ชจ ์ ๋ณด๋ ์กด์ฌํ์ง ์๋๋ค. ์ ํํ๋ ๊ทธ ๋ถ๋ชจ ์ ๋ณด(T.nil.p
)๊ฐy
๊ฐ ์๋ ์ ์๋ค.T.nil
๋ ์ ์ฒด ํธ๋ฆฌ์์ ๋ฑ ํ๋์ธ ๋ ธ๋์ด๊ธฐ ๋๋ฌธ์, ์ฌ๋ฌ ์ฝ์ ๊ณผ ์ญ์ ๊ณผ์ ์์ ์์ ๋ณ์๊ฐ ๊ณ์ํด์ ๋ฐ๋๋ค.(color
๋ BLACK์ผ๋ก ๊ณ ์ .)
- Its color attribute is BLACK, and its other attributesโp, left, right, and keyโcan take on arbitrary values.
- The values of the attributes p, left, right, and key of the sentinel are immaterial, although we may set them during the course of a procedure for our convenience.
์ด ๊ฐ๋ค์ด ์ด๋ค ์๋ฏธ๋ ์ฉ๋๋ฅผ ๊ฐ์ง์ง ์์ง๋ง, ์ ์ด๋ ์์ ์ญ์ ํจ์์์๋ ๋ฐ๋์
T.nil.p
์ ์ ๋ณด๋ฅผ ํ์ฌ ํจ์ ์คํ ๊ณผ์ ์ ๋ง๊ฒ ์ค์ ํด์ค์ผ ํ๋ค. ์๋ํ๋ฉดx
๋T.nil
๋ ธ๋์ด๊ธฐ ์ด์ ์ ํ์ฌ ์ญ์ ์ฐ์ฐ์์y
์ ์์์ผ๋ก์, ์ดํRB-DELETE-FIXUP(T,x)
์ ์ธ์๋ก ์ ๋ฌ๋๊ณ , ์ด ํจ์ ๋ด์์x
๋ ์์ ์ ๋ถ๋ชจ ์ ๋ณด๋ฅผ ํตํด ์์ ์ ํ์ (w
)์ ์ ๋ณด๋ฅผ ์ป์ ์ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ง์ฝ ์ด๋ฌํ ํ์์ฑ์ด ์๋ค๋ฉด, ๊ตณ์ดx.p = y
๋ฅผ ํตํด ๋ฐ๋ก ๋ช ์ํ ํ์๊ฐ ์๋ค. ์ค์ ๋ก ์ผ๋ฐ ์ด์ง ํ์ ํธ๋ฆฌ์ ์ญ์ ๊ณผ์ ์์๋y.p == z
์ ๋ํ ์กฐ๊ฑด์ด ์๊ณy.p != z
์ผ๋๋งRB-TRANSPLANT(T,y,y.right); y.right = z.right; y.right.p = y;
์ ์คํํ ๋ฟ์ด๋ค.
๋ญ๊ฐ ๋ง์ง๋ง ์ ๋ง ํฌ๊ฒ ๋ดค์ ๋, Z๋ฅผ ๋์ฒดํ๋ Y์ ์์ด ์ ์์ด๋ ํ์์ด๋์ ๋ฐ๋ผ ์๋ฐ ๋ฐ์ ์ฌ๋ถ๋ฅผ ์ดํด๋ณผ ์ ์๊ฒ ๋ค.
Y๊ฐ ์ ์์ผ ๋ โก๏ธ ์๋ฐ์ด ๋ฐ์ํ์ง ์๋๋ค.
Y๊ฐ ์ ์์ด๋ฏ๋ก ๊ทธ์ ์์์ธ X์ ์์ ํ์์ผ ์ ๋ฐ์ ์์์ ๊ธฐ์ตํ๊ณ ์์.
- ํ์ ๋์ด๋ ๋ชจ๋ ๊ทธ๋๋ก ์ ์ง๋๋ค.
1)Y๋ ์ญ์ ๋ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํด
์ ๊ฒฝ์ฐ :
- ์ ์์ธ Y(=Z)์ ์๋ฆฌ์ ํ์์ธ X๊ฐ ๋ค์ด๊ฐํ ๋ ๊ฒฝ๋ก์์ ํ์์ ๊ฐ์๋ ๋ณํ์ง ์๋๋ค.
2)Y๋ ์ด๋ํ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํด
์ ๊ฒฝ์ฐ :
- ์์ ์ฝ๋์์ ๋ณด๋ฏ์ด Z์ ์์ '์ ์์ธ Y'์๊ฒ ๊ฐ์ ํ๊ฒ ๋๋ฏ๋ก ํ์์ ๊ฐ์๊ฐ ์ค์ด๋ค์ง ์๋๋ค.
- ์ ์ ๋ ธ๋๊ฐ ์ธ์ ํ์ง ์๋๋ค.
1)Y๋ ์ญ์ ๋ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํด
์ ๊ฒฝ์ฐ :
- ์ ์์ธ Y(=Z)์ ์๋ฆฌ์ ํ์์ธ X๊ฐ ๋ค์ด๊ฐํ ๋ ์ ์ ๋ ธ๋๊ฐ ์ธ์ ํ ๊ฒฝ์ฐ๊ฐ ์๋ค.
2)Y๋ ์ด๋ํ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํด
์ ๊ฒฝ์ฐ :
- ์์ ์ฝ๋์์ ๋ณด๋ฏ์ด Z์ ์์ Y๊ฐ ๊ทธ๋๋ก ๋ฌผ๋ ค๋ฐ๊ธฐ ๋๋ฌธ์ ์ ์๋ ธ๋๊ฐ ์ธ์ ํ (์๋ฐฐ์ด์ด ์ด๊ธ๋ ) ๊ฒฝ์ฐ๊ฐ ์๋ค. Y๊ฐ Z์ ๋ฐ๋ก ๋ฐ ์์์ด ์๋ ๊ฒฝ์ฐ์ X๊ฐ Y์ ์๋ฆฌ๋ฅผ ์ฐจ์งํ๊ฒ ๋ ๋ ๋ํ, Y๊ฐ ์ ์์์ผ๋ก์ธํด X(Y์ ์์)์ด ํ์์ด๋ฏ๋ก ์ ์๋ ธ๋๊ฐ ์ธ์ ํ ๊ฒฝ์ฐ๊ฐ ์๋ค.
- Y๊ฐ ์ ์์ด๋ฉด ๋ฃจํธ๊ฐ ๋ ์ ์์ผ๋ฏ๋ก, ๋ฃจํธ๋ ํ์์ผ๋ก ์ ์ง๋๋ค.
1)Y๋ ์ญ์ ๋ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํด
์ ๊ฒฝ์ฐ :
- ์ด ๋ฌธ์ฅ์ ๋น์ฐํ๋ค. Y๋ ๋ฐ๋ก Z๋ฅผ ๋ฎ์ด์ฐ๊ฒ ๋๋๋ฐ ๊ทธ๋ฌ๋ฉด Y๋ ํ์์ด๊ธฐ ๋๋ฌธ์ด๋ค.
2)Y๋ ์ด๋ํ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํด
์ ๊ฒฝ์ฐ :
- ์ด๋ ํ์ Y๋ Z์ ์์ ๊ฐ์ ๋นํ๋ฏ๋ก, ์ญ์ ์๊ด์ด ์๋ค.
Y๊ฐ ํ์์ผ ๋ โก๏ธ ์ธ ๊ฐ์ง ์๋ฐ ๋ฐ์ ๊ฐ๋ฅ.
Y๊ฐ ํ์์ด๋ฏ๋ก X๊ฐ ์ ์์ผ ์ ์๋ค. ์ด ์ ์ ๊ธฐ์ตํ๊ณ ์์.
โ ๏ธ ํน์ฑ 2 : "๋ฃจํธ๋ ํ์์ด๋ค."
Y๋ ์ญ์ ๋ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํด
์ ๊ฒฝ์ฐ์, Y๊ฐ ๋ฃจํธ๊ณ , Y์ ์ ์ ์์(X)์ด ์๋ก์ด ๋ฃจํธ๊ฐ ๋๋ค๋ฉด ๋ฃจํธ๊ฐ ์ ์์ด ๋๋ค. 'Y๋ ์ด๋ํ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํด'์ ๊ฒฝ์ฐ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ Z(์๋ ๋ฃจํธ์๋)์ ์์ด ๊ฐ์ ๋์ง๋ ์๋๋ค.
โ ๏ธ ํน์ฑ 4 : "๋ ธ๋๊ฐ ์ ์์ด๋ฉด ๊ทธ ๋ ธ๋์ ์์์ ๋ชจ๋ ํ์์ด๋ค."
Y๋ ์ด๋ํ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํด
์ ๊ฒฝ์ฐ์, ์ด๋ ํ์ X์ X.p( r )๊ฐ ๋๋ค ์ ์์ด๋ฉด, ์ ์ ๋ ธ๋์ ์์์ด ์ ์์ด ๋๋ค. ์๋ ์ด๋ ์ ํ์ Y๊ฐ r๊ณผ X ์ฌ์ด์ ์์๊ธฐ ๋๋ฌธ์ r๊ณผ X๋๋ค ์ ์์ธ ๊ฒฝ์ฐ๊ฐ ๊ฐ๋ฅํ๋ค.
โ ๏ธ ํน์ฑ 5: "๊ฐ ๋ ธ๋๋ก๋ถํฐ ๊ทธ ๋ ธ๋์ ์์์ธ ๋ฆฌํ๋ก ๊ฐ๋ ๊ฒฝ๋ก๋ค์ ๋ชจ๋ ๊ฐ์ ์์ ํ์ ๋ ธ๋๋ฅผ ํฌํจํ๋ค."
Y๋ ์ด๋ํ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํด
,Y๋ ์ญ์ ๋ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํด
์ ๋๊ฐ์ง ๊ฒฝ์ฐ ๋ชจ๋์ ๋ํด, ํ์์ธ Y๊ฐ ์ด๋ ๋๋ ์ญ์ ๋จ์ผ๋ก์จ Y๋ฅผ ์๋ ํฌํจํ๊ณ ์๋ ๊ฒฝ๋ก์์๋ ํ์ ๋ ธ๋๊ฐ ํ๋ ์ค๊ฒ ๋๋ค. ์๋ํ๋ฉด ๋ง๊ทธ๋๋ก ์๋์ Y๊ฐ ๊ทธ ์๋ฆฌ์์ ์งํค๊ณ ์๋ ์์ด ํ๋ ์์ด์ง๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ ์๋ Y์ ์กฐ์(Z์ ์กฐ์ or (Z or r))์ ๋ํด ํน์ฑ 5๊ฐ ์๋ฐ๋๋ค.
์ด ์ธ ๊ฐ์ง ์๋ฐ์ RB-DELETE-FIXUP
์์ ํด๊ฒฐ ํ ์ ์๋ค.
์ ํจ์์ ๋ฐ๋ณต๋ฌธ์๋, ํน์ฑ 1 ์๋ฐ์ ํด๊ฒฐํ๋ ๊ณผ์ ์ด ์ฃผ๋ก ๋ด๊ฒจ์๋ค. ํน์ฑ 5 ์๋ฐ์ ์ด๋ ํ ๊ฐ์ ์ ํตํด ์์ฃผ ๊ฐ๋จํ ํด๊ฒฐํ๋ฉด ํน์ฑ 1 ์๋ฐ์ด ๋ค์ ๋ฐ์ํ๋๋ฐ, ์ด๋ฐ ์์ผ๋ก ๋ฌธ์ ๋ฅผ ์ ํํด ๋ณต๊ตฌ๋ฅผ ์ฉ์ดํ๊ฒ ํ๋ค. ๋ณต๊ตฌํ๋ ๊ณผ์ ์์ ๋๋จธ์ง ํน์ฑ 2์ 4 ์ ๋ํ ์๋ฐ์ด ํจ๊ป ํด๊ฒฐ๋๋ค.
์ด๋ค ๊ฐ์ ์ ํ๋ค๋ ๊ฒ์ผ๊น?
๋ฐ๋ก ์์์ ์ค๋ช
ํ ํน์ฑ 5 ์๋ฐ์ ๋ํด ์๋ฌธ์ ์ด ํ ๊ฐ์ง ๋ค ์ ์์ ๊ฒ์ด๋ค.
'๊ทธ๋ฌ๋ฉด Y์ ์๋ฆฌ๋ฅผ ์ฑ์ฐ๋ X๋ฅผ ํ์์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ฉด ๊ทธ๋ง ์๋๊ฐ?'
์ ๊ทธ๋ฆผ์์ ๋ณด๋ฉด Z=Y = 75 ์ด๊ณ , X = 70์ด๋ค. X๋ฅผ ํ์์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ ์ค์ ๋ก ์๋ฐ์ด ๋ณต๊ตฌ๋์๋ค.
ํ์ง๋ง ์ด๋ ๊ฒ ํด๊ฒฐ ๋์ง ์๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
์์ ๊ทธ๋ฆผ์์ Z=Y = B ์ด๊ณ , X = C ์ด๋ค. ์ญ์ ๋ ์๋ฆฌ์ X(C)๊ฐ ๋ค์ด๊ฐ์ ํ์์ด ๋์์ง๋ง, ํน์ฑ 5 ์๋ฐ์ด ๋ณต๊ตฌ๋์ง ์์๋ค. ๋ฃจํธ์์ C๊ฐ ํฌํจ๋ ๊ฒฝ๋ก์ ํ์์ ๊ฐ์๋ 2๊ฐ์ด๊ณ , ๋๋จธ์ง ๊ฒฝ๋ก๋ค์ ํ์ ๊ฐ์๋ 3๊ฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ์ฆ, X๊ฐ ์๋ ๊ณณ ์กฐ์ฐจ ํ์์ด์์ผ๋ฉด ๋จ์ํ X๋ฅผ ๊ธฐ์กด Y์๋ฆฌ์ ์ฑ์๋๊ณ ํ์์ผ๋ก ์น ํ๋ ๊ฒ๋ง์ผ๋ก๋ ๋ณต๊ตฌ๊ฐ ๋ถ๊ฐ๋ฅํ๋ค.
๊ทธ๋์ ๋ฌธ์ ๋ฅผ ์นํํ๊ธฐ์ํด, ์ด์ค ํ์ ๋
ธ๋๋ผ๋ ๊ฐ๋
์ ๋์
ํด ํน์ฑ 5 ์๋ฐ์ ๋ฌด๋งํด๋ฒ๋ฆฐ๋ค.
์ ์๊ฐํด๋ณด๋ฉด, X๊ฐ ๋ฌด์จ ์์ด์๋ ์ผ๋จ ํ์์ผ๋ก ์น ํ๋ฉด (ํ์์ ํ๋ ๋ ์ฃผ๋ฉด) ์๋ ๊ฒฝ๋ก์์ ํ์์ ๊ฐ์๊ฐ ๋ณํ์ง ์์ ์ ์๋ค.
- ์๋ X๊ฐ ์ ์์ด์๋ค๋ฉด, ๋ฐ๋ก ์ ์ ๊ทธ๋ฆผ์ฒ๋ผ ๋จ์ํ X๋ฅผ ํ์์ผ๋ก ์น ํด์ฃผ๋ ๊ฒ์ผ๋ก ๋ชจ๋ ์๋ฐ์ด ๋ณต๊ตฌ๋๋ค.
- ์๋ X๊ฐ ํ์์ด์๋ค๋ฉด, ๊ทธ ํ์์ ์๋ก ์น ํด์ง ํ์์ด ๋ํด์ ธ ํ์์ ๊ฐ์๊ฐ 2๊ฐ๋ก ๊ณ์ฐ์ด ๋๋ค.(์ด์ค ํ์ ๋ ธ๋๊ฐ ๋ ๊ฒ์ด๋ค.) ๊ทธ๋์ ํน์ฑ 5 ์๋ฐ์ ๋ณต๊ตฌ๋๋ค. -> ํ์ง๋ง ํน์ฑ 1 ์๋ฐ์ด ๋ฐ์ํ๋ค.
๊ฒฐ๊ตญ RB-DELETE-FIXUP
์ ๋ฐ๋ณต๋ฌธ์ ํตํด ๋ค์ ์ด ํน์ฑ 1 ์๋ฐ์ ๋ณต๊ตฌํ๋ฉด ๋๋ค.
๋ค์ ๋งํ๋ฉด, ์๋ ํ์์ด์๋ X๊ฐ ๋ฐ์ '์ฌ๋ถ์ ํ์'์ ๋ฐ๋ณต๋ฌธ์ ํตํด ์์ ๋ฉด ๋๋ค.
์ฝ๋๋ฅผ ๋ณด์..
RB-DELETE-FIXUP(T,x)
while x != T.root and x.color == BLACK
if x == x.p.left
w = x.p.right // 'w๋ x์ ํ์ .'
// ๊ฒฝ์ฐ 1. ํ์ w๊ฐ ์ ์์ธ ๊ฒฝ์ฐ.
if w.color = RED
w.color = BLACK
x.p.color = RED
LEFT-ROTATE(T,x.p)
w = x.p.right
// ๊ฒฝ์ฐ 2. ํ์ w๊ฐ ํ์. w ์์๋ค ๋๋ค ํ์์ธ ๊ฒฝ์ฐ.
if w.left.color == BLACK and w.right.colot == BLACK
w.color = RED
x = x.p
else
// ๊ฒฝ์ฐ 3. ํ์ w๊ฐ ํ์. w์ ์ผ์ชฝ์์์ ์ ์, ์ค๋ฅธ์ชฝ ์์์ ํ์์ธ ๊ฒฝ์ฐ.
if w.right.color == BLACK
w.left.color = BLACK
w.color = RED
RIGHT-ROTATE(T,w)
w = x.p.right
// ๊ฒฝ์ฐ 4. ํ์ w๊ฐ ํ์. w์ ์ค๋ฅธ์ชฝ ์์์ ์ ์์ธ ๊ฒฝ์ฐ.
w.color = x.p.color
x.p.color = BLACK
w.right.color = BLACK
LEFT-ROTATE(T,x.p)
x = T.root
else
/*
์์ ๋์นญ. (x == x.p.right์ธ ๊ฒฝ์ฐ์ด๋ฏ๋ก.)
*/
x.color = BLACK // ๋ฐ๋ณต๋ฌธ ์ข
๋ฃ๋๋ฉด(x๊ฐ ๋ฃจํธ ๋๋ ์ ์๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํฌ ๋) x๋ฅผ ํ์์ผ๋ก ์น ํ๋ค.
// ๋ฃจํธ๋ฅผ ๊ฐ๋ฆฌํฌ ๋๋ ์ด๋ฏธ ์ด์ค ํ์ ๋
ธ๋์ ์ฌ๋ถ์ ํ์์ด ๋ค๋ฅธ ๋
ธ๋์๊ฒ ๋๋ ์ง ์ํ์ด๊ณ ,
// ์ ์๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํฌ ๋๋ ์ฌ๋ถ์ ํ์์ ํ๋ ๊ฐ์ ธ์จ ๊ฒ์ด๋ฏ๋ก, ์ง๊ธ ๊ฐ๋ฆฌํค๊ณ ์๋ ์ ์๋
ธ๋์ ์น ํด์ฃผ๋ฉด ๋์ด๋ค.
์ ๋ฐ๋ณต๋ฌธ์ ํ์ถ ์กฐ๊ฑด์ X๊ฐ ์ ์์ธ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๊ฑฐ๋, X๊ฐ ๋ฃจํธ๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๋ ๊ฒฝ์ฐ์ด๋ค. ๋๋ค '์ฌ๋ถ์ ํ์'์ ๊ทธ ๋
ธ๋์ ์น ํจ์ผ๋ก์จ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์๊ฒ๋๋ ๊ฒฝ์ฐ์ด๋ค.
๋ฐ๋ฉด์ ๋ฐ๋ณต๋ฌธ์ด ์คํ๋๋ ์กฐ๊ฑด์ X๊ฐ ํ์ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํฌ ๋, ์ฆ ์ด์ค ํ์ ๋
ธ๋์ผ ๋์ด๋ค. ์ด๋ 4๊ฐ์ ๊ฒฝ์ฐ๋ก ๋๋ ์ ์๋ค.
w๋ฅผ x์ ํ์ (sibling)๋ผ๊ณ ํ์.
ํฌ๊ฒ w๊ฐ ์ ์์ผ ๋(๊ฒฝ์ฐ 1), w๊ฐ ํ์์ผ ๋(๊ฒฝ์ฐ 2,3,4)๊ฐ ์๋ค.
- w๊ฐ ์ ์์ธ ๊ฒฝ์ฐ.
sibling(D)์ ํ์์ผ๋ก, parent(B)๋ฅผ ์ ์์ผ๋ก ๋ฐ๊พธ๊ณ , parent(B)๋ฅผ ๊ธฐ์ค์ผ๋กLEFT-ROTATE
ํ๋ค.
๊ทธ๋ฌ๋ฉด x์ new sibling(C)๋ ํ์์ด ๋๊ณ , ๊ฒฝ์ฐ 2,3,4 ์ค ํ๋๋ก ๋์ด๊ฐ ์ ์๋ค.
์ด์ค ํ์ ๋ ธ๋๋ ์์ง ๋จ์์๋ ์ํ์ด๋ค.
- w๊ฐ ํ์์ด๊ณ , w์ ์์๋ค์ด ๋๋ค ํ์์ผ ๊ฒฝ์ฐ.
c์ ์๋ฏธ๋ ์ ์, ํ์ ์ค์ ํ๋๋ผ๋ ์๋ฏธ์ด๋ค. x์ sibling ๋๋ค ํ์์ธ ์ํฉ์ธ๋ฐ, ๊ฐ๊ฐ์์ ํ์ ํ๋์ฉ์ ๋นผ์์ (x์์ ์ฌ๋ถ์ ํ์, sibling์ ์๊ธฐ๊ฐ ๊ฐ์ง ํ์) parent(B)์ ์ ๋ฌํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์์ชฝ ๊ฒฝ๋ก์ ํ์ ๊ฐ์๋ ๋ณํ์ง ์์ผ๋ฉด์, ์ฌ๋ถ์ ํ์์ B์๊ฒ ๋๊ธธ ์ ์๋ค.
์ดํ์ parent(B)๋ฅผ ์๋ก์ด x๋ก ์ผ๊ณ ๋ฐ๋ณต๋ฌธ์ ๋ค์ ์งํํ๋๋ฐ, parent(B)์ ์๋ ์์์ด ์ ์์ด์๋ค๋ฉด ๋ฐ๋ณต๋ฌธ์ด ์คํ๋์ง ์์ ๊ฒ์ด๊ณ , ํ์์ด์๋ค๋ฉด ์ด์ค ํ์ ๋ ธ๋์ด๊ธฐ ๋๋ฌธ์ (์ฌ๋ถ์ ํ์์ ๋ฐ์์ผ๋ฏ๋ก) ๋ฐ๋ณต๋ฌธ์ด ๋ค์ ์คํ๋์ด ๊ฒฝ์ฐ 1,2,3,4 ์ค ์ ํ๋๋ก ์ฒ๋ฆฌ ๋ ๊ฒ์ด๋ค.
- w๊ฐ ํ์์ด๊ณ , w์ ์ผ์ชฝ ์์์ ์ ์, w์ ์ค๋ฅธ์ชฝ ์์์ ํ์์ธ ๊ฒฝ์ฐ.
๊ฒฝ์ฐ 3์ ๊ฒฝ์ฐ 4๋ก ๋์ด๊ฐ๊ธฐ ์ํ ์ค๋น๋จ๊ณ์ด๋ค. ๊ฒฝ์ฐ 4์์๋ ๋ฐ๋ณต๋ฌธ์ ์ข ๋ฃํ ์ ์๋ค.
sibling(D)์ ์ ์์ผ๋ก, sibling์ left-child(C)๋ ํ์์ผ๋ก ์์ ๋ฐ๊พธ๊ณ , sibling(D)์ ๋ํดRIGHT-ROTATE
์ ํ ์ ์๋ค. ์ด ๊ณผ์ ์์ ์๋ฐ๋๋ ํน์ฑ์ ์๋ค. ์ดํ์ c๋ฅผ new sibling์ผ๋ก ์ค์ ํ๋ฉด, w๊ฐ ํ์์ด๊ณ ์ค๋ฅธ์ชฝ ์์์ด ์ ์์ธ ๊ฒฝ์ฐ 4๋ก ๋์ด๊ฐ ์ ์๋ค.
- w๊ฐ ํ์์ด๊ณ , w์ ์ค๋ฅธ์ชฝ ์์์ ์ ์.
parent์ ์์ sibling์ ์น ํ๋ค. ๊ทธ๋ฆฌ๊ณ parent์ sibling์ right-child๋ฅผ ํ์์ผ๋ก ์น ํ๋ค. ์ดํ์ parent๋ฅผ ๊ธฐ์ค์ผ๋กLEFT-ROTATE(T,x.p)
ํ๋ค. ๊ทธ ๊ฒฐ๊ณผ ์ค๋ฅธ์ชฝ ๊ทธ๋ฆผ์์ ๋ณด์ด๋ฏ์ด x์ ์ด์ค ํ์์ด A์ B์ ๋ถ์ฐ๋์ด ํ์์ ๊ฐ์๊ฐ ์ ์ง๋๋ฉด์๋ ํน์ฑ 1 ์๋ฐ์ด ๋ณต๊ตฌ๋๋ ์์์ ๋ ๊ฒ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์ ์์น ๊ณผ ํ์ ์ ๊ฒฐ๊ณผ์์ ํน์ฑ 4๊ฐ ์๋ฐ๋์ง๋ ์๋๋ค. ์ด์ ํน์ฑ์ ์๋ฐ์ด ๋ชจ๋ ๋ณต๊ตฌ ๋์์ผ๋ฏ๋ก, x๊ฐ ๋ฃจํธ๋ฅผ ๊ฐ๋ฆฌํค๊ฒํด ๋ฐ๋ณต๋ฌธ์ด ๋์ด์ ์คํ๋์ง ์๊ฒ ํ๋ค.
๋ฐ๋ณต๋ฌธ์ ๊ฒฝ์ฐ 2์ 4์ ๊ฒฝ์ฐ์์๋ง ์ข ๋ฃ๋ ์ ์๋ค.
CLRS (https://sd.blackball.lv/library/Introduction_to_Algorithms_Third_Edition_(2009).pdf)
https://m.blog.naver.com/PostView.naverisHttpsRedirect=true&blogId=cestlavie_01&logNo=220914445383
https://www.youtube.com/watch?v=nMExd4DthdA