๐Ÿ’พ[์ž๋ฃŒ๊ตฌ์กฐ] RB-tree

์ด๊ฐ•์šฑยท2022๋…„ 10์›” 23์ผ
6

๐Ÿ’พ ์ž๋ฃŒ๊ตฌ์กฐ

๋ชฉ๋ก ๋ณด๊ธฐ
1/1
post-thumbnail

Red-Black tree

๋ ˆ๋“œ๋ธ”๋ž™ ํŠธ๋ฆฌ(red-black tree)๋Š” ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋กœ์„œ, ๊ฐ ๋…ธ๋“œ๋‹น ํ•œ ๋น„ํŠธ์˜ ์ถ”๊ฐ€ ๊ธฐ์–ต ๊ณต๊ฐ„์„ ๊ฐ€์ง„๋‹ค.

์ด ๋น„ํŠธ๋Š” RED ๋˜๋Š” BLACK์˜ ์ƒ‰๊น”์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
๋ฃจํŠธ์—์„œ ๋ฆฌํ”„๊นŒ์ง€์˜ ๊ฒฝ๋กœ์— ๋‚˜ํƒ€๋‚˜๋Š” ๋…ธ๋“œ์˜ ์ƒ‰๊น”์„ ์ œํ•œํ•จ์œผ๋กœ์จ, ํŠธ๋ฆฌ์˜ ๊ท ํ˜•์„ ๊ทผ์‚ฌ์ ์œผ๋กœ ์œ ์ง€ํ•œ๋‹ค.

ํŠน์„ฑ

๋‹ค์Œ 5๊ฐœ์˜ ๋ ˆ๋“œ๋ธ”๋ž™ ํŠน์„ฑ์„ ๋งŒ์กฑํ•˜๋Š” ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋ฅผ ๋ ˆ๋“œ๋ธ”๋ž™ ํŠธ๋ฆฌ๋ผ๊ณ  ํ•œ๋‹ค.

  1. ๋ชจ๋“  ๋…ธ๋“œ๋Š” ์ ์ƒ‰์ด๊ฑฐ๋‚˜ ํ‘์ƒ‰์ด๋‹ค.
  2. ๋ฃจํŠธ๋Š” ํ‘์ƒ‰์ด๋‹ค.
  3. ๋ชจ๋“  ๋ฆฌํ”„(NIL)๋Š” ํ‘์ƒ‰์ด๋‹ค.
  4. ๋…ธ๋“œ๊ฐ€ ์ ์ƒ‰์ด๋ฉด ๊ทธ ๋…ธ๋“œ์˜ ์ž์‹์€ ๋ชจ๋‘ ํ‘์ƒ‰์ด๋‹ค.
  5. ๊ฐ ๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ ๊ทธ ๋…ธ๋“œ์˜ ์ž์†์ธ ๋ฆฌํ”„๋กœ ๊ฐ€๋Š” ๊ฒฝ๋กœ๋“ค์€ ๋ชจ๋‘ ๊ฐ™์€ ์ˆ˜์˜ ํ‘์ƒ‰ ๋…ธ๋“œ๋ฅผ ํฌํ•จํ•œ๋‹ค.
  • ํŠน์„ฑ 2,4,5๊ฐ€ ์‚ฝ์ž…/์‚ญ์ œ ์—ฐ์‚ฐ์ด ์ผ์–ด๋‚  ๋•Œ ์ฃผ๋กœ ์œ„๋ฐ˜๋˜๋Š” ํŠน์„ฑ๋“ค.
  • ํŠน์„ฑ 1์€ ๋‹น์—ฐํ•ด ๋ณด์ด์ง€๋งŒ, ์ดํ›„ ํŠธ๋ฆฌ์˜ ๊ท ํ˜•์„ ๋งž์ถ”๋Š” ๊ณผ์ •(FIX-UP)์—์„œ ํ‘์ƒ‰์˜ ๊ฐœ์ˆ˜๋ฅผ ์กฐ์ ˆํ•  ๋•Œ(์ฆ‰, ํŠน์„ฑ 5 ์œ„๋ฐ˜์„ ๋ณต๊ตฌํ•  ๋•Œ) ์ƒ‰์ด ํ™•์ •๋˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ์ƒ์ •ํ•˜๊ณ  ์ง„ํ–‰ํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด, ํŠน์„ฑ 5์˜ ์œ„๋ฐ˜์„ ํŠน์„ฑ 1์˜ ์œ„๋ฐ˜์œผ๋กœ ์ „ํ™˜ํ•ด ํšจ์œจ์ ์œผ๋กœ ๋ณต๊ตฌ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค. ๊ทธ ๋ถ€๋ถ„์„ ์œ„ํ•ด ์กด์žฌ.
  • ํŠน์„ฑ 5์—์„œ '๋ชจ๋‘'์˜ ๋ฒ”์œ„๋Š”, '๊ทธ ๋…ธ๋“œ์—์„œ ๋‚ด๋ฆด ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๋“ค'์ด๋‹ค. ํŠธ๋ฆฌ ์ „์ฒด์˜ ๊ฒฝ๋กœ๋“ค์ด ์•„๋‹ˆ๋‹ค.
  • ํŠน์„ฑ 3์€ '๋ฃจํŠธ์˜ ๋ถ€๋ชจ์˜ ์ƒ‰'์ด ํ‘์ƒ‰์ž„์„ ๋ณด์žฅํ•ด์ค€๋‹ค. ๋ฃจํŠธ์˜ ๋ถ€๋ชจ๋Š” T.NIL ๋…ธ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์„ผํ‹ฐ๋„ ๋…ธ๋“œ (sentinel node)

๊ฒฝ๊ณ„ ๋…ธ๋“œ.

  • ์ฝ”๋“œ ์ž‘์„ฑ์‹œ ํ•œ๊ณ„ ์กฐ๊ฑด์„ ๋‹ค๋ฃจ๊ธฐ ํŽธํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๋”๋ฏธ(dummy) ๋…ธ๋“œ : T.nil
  • ์—ฐ์‚ฐ ์‹œ๊ฐ„์˜ ์ƒ์ˆ˜์ธ์ž๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Œ.

์„ผํ‹ฐ๋„ ๋…ธ๋“œ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๊ฐ™์€ ํŠธ๋ฆฌ๋„ (b)์ฒ˜๋Ÿผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

Sentinel Node vs NULL pointer

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์€ ๋ฐ˜๋ณต๋ฌธ ์‹คํ–‰ํ›„ ๋ฐ˜๋ณต์ด ์ข…๋ฃŒ๋œ๋‹ค.

  • ๊ฒฝ์šฐ 1 : ์‚ผ์ดŒ์ด ์ ์ƒ‰์ธ ๊ฒฝ์šฐ

    ๋ถ€๋ชจ z.p๋„ ์ด๋ฏธ ์ ์ƒ‰์ด๋ฏ€๋กœ z์˜ ์œ—๋‹จ๊ณ„ (๋ถ€๋ชจ, ์‚ผ์ดŒ)์€ ์ „๋ถ€ ์ ์ƒ‰์ด๋‹ค.
    ๊ทธ๋ž˜์„œ ์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ z์˜ ์œ—๋‹จ๊ณ„๋ฅผ ์ „๋ถ€ ํ‘์ƒ‰์œผ๋กœ ๋งŒ๋“ค๊ณ , ์กฐ๋ถ€๋ชจ๋ฅผ ์ ์ƒ‰์œผ๋กœ ๋งŒ๋“ค์–ด
    (๋ฐ˜๋ณต๋ฌธ ์‹คํ–‰ ์ „ ์กฐ๋ถ€๋ชจ(z.p.p)๋Š” ๋ฌด์กฐ๊ฑด ํ‘์ƒ‰์ด๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋ถ€๋ชจ(z.p)๊ฐ€ ์ ์ƒ‰์ด๊ณ , ์‚ฝ์ž…ํ•˜๊ธฐ ์ „ ํŠธ๋ฆฌ๋Š” ์œ„๋ฐ˜์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, z์™€ z.p์‚ฌ์ด์˜ ์œ„๋ฐ˜๋งŒ ์กด์žฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.)
    ํŠธ๋ฆฌ์˜ ํŠน์„ฑ์„ ์œ ์ง€์‹œํ‚จ ํ›„, z๋ฅผ ์กฐ๋ถ€๋ชจ๋กœ ๋‹ค์‹œ ์„ค์ •ํ•˜๊ณ  ๋ฐ˜๋ณต๋ฌธ์˜ ์ฒ˜์Œ์œผ๋กœ ๋Œ์•„๊ฐ„๋‹ค.
  • ๊ฒฝ์šฐ 2,3 : ์‚ผ์ดŒ์ด ํ‘์ƒ‰์ธ ๊ฒฝ์šฐ

    (์œ„์˜ ๊ทธ๋ฆผ์—์„œ y๊ฐ€ ์‚ผ์ดŒ์ด๊ณ  ํ‘์ƒ‰์ด๋‹ค.)

    ๋จผ์ € ๊ฒฝ์šฐ 3์„ ๋จผ์ € ๋ณด์ž.
    ๋ถ€๋ชจ(B)๋ฅผ ํ‘์ƒ‰์œผ๋กœ ๋งŒ๋“ค๊ณ , ์กฐ๋ถ€๋ชจ(C)๋ฅผ ์ ์ƒ‰์œผ๋กœ ๋งŒ๋“  ํ›„, RIGHT-ROTATEํ•˜๋ฉด ์œ„๋ฐ˜์ด ์‚ฌ๋ผ์ง„๋‹ค.
    ๊ฒฝ์šฐ 2๋Š” A-B์—ฐ๊ฒฐ๊ด€๊ณ„๋ฅผ LEFT-ROTATEํ•ด์„œ ๊ฒฝ์šฐ 3์˜ ๋ชจ์–‘๊ณผ ๊ฐ™๊ฒŒ ๋งŒ๋“ค๊ณ  ์ดํ›„์—๋Š” ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์œ„๋ฐ˜์„ ์—†์• ๋ฉด ๋œ๋‹ค.

์‚ญ์ œ

๋จผ์ € ๊ธฐ๋ณธ ์ด์ง„ํŠธ๋ฆฌ์˜ ์‚ญ์ œ๋Š” ๋‘๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค. ์‚ญ์ œํ•˜๊ณ ์ž ํ•˜๋Š” ๋…ธ๋“œ๋ฅผ Z๋ผ๊ณ  ํ•˜์ž.

  1. Z๊ฐ€ ํ•˜๋‚˜ '์ดํ•˜'์˜ ์ž์‹์„ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๊ฒฝ์šฐ, ๊ทธ ์ž์‹๋…ธ๋“œ๊ฐ€ Z์˜ ์ž๋ฆฌ๋ฅผ ๋Œ€์‹ ํ•˜๋ฉด ๋œ๋‹ค.
    ์•„๋ž˜๋Š” ๊ทธ ํ•˜๋‚˜์˜ ์ž์‹๋…ธ๋“œ๊ฐ€ ์™ผ์ชฝ ์˜ค๋ฅธ์ชฝ์ด๋ƒ์˜ ์ฐจ์ด์ผ ๋ฟ.
  2. 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์˜ ์ƒ‰์ด ์ ์ƒ‰์ด๋ƒ ํ‘์ƒ‰์ด๋ƒ์— ๋”ฐ๋ผ ์œ„๋ฐ˜ ๋ฐœ์ƒ ์—ฌ๋ถ€๋ฅผ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

  1. 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์˜ ์ƒ‰์„ ๊ฐ•์ œ๋‹นํ•˜๋ฏ€๋กœ, ์—ญ์‹œ ์ƒ๊ด€์ด ์—†๋‹ค.
  2. 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๋ฅผ ํ‘์ƒ‰์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋‹ˆ ์‹ค์ œ๋กœ ์œ„๋ฐ˜์ด ๋ณต๊ตฌ๋˜์—ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ํ•ด๊ฒฐ ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

์ด์ค‘ ํ‘์ƒ‰ ๋…ธ๋“œ (Double Black Node)


์œ„์˜ ๊ทธ๋ฆผ์—์„œ Z=Y = B ์ด๊ณ , X = C ์ด๋‹ค. ์‚ญ์ œ๋œ ์ž๋ฆฌ์— X(C)๊ฐ€ ๋“ค์–ด๊ฐ€์„œ ํ‘์ƒ‰์ด ๋˜์—ˆ์ง€๋งŒ, ํŠน์„ฑ 5 ์œ„๋ฐ˜์ด ๋ณต๊ตฌ๋˜์ง€ ์•Š์•˜๋‹ค. ๋ฃจํŠธ์—์„œ C๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ๋กœ์˜ ํ‘์ƒ‰์˜ ๊ฐœ์ˆ˜๋Š” 2๊ฐœ์ด๊ณ , ๋‚˜๋จธ์ง€ ๊ฒฝ๋กœ๋“ค์˜ ํ‘์ƒ‰ ๊ฐœ์ˆ˜๋Š” 3๊ฐœ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฆ‰, X๊ฐ€ ์žˆ๋˜ ๊ณณ ์กฐ์ฐจ ํ‘์ƒ‰์ด์—ˆ์œผ๋ฉด ๋‹จ์ˆœํžˆ X๋ฅผ ๊ธฐ์กด Y์ž๋ฆฌ์— ์ฑ„์›Œ๋†“๊ณ  ํ‘์ƒ‰์œผ๋กœ ์น ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ๋ณต๊ตฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ทธ๋ž˜์„œ ๋ฌธ์ œ๋ฅผ ์น˜ํ™˜ํ•˜๊ธฐ์œ„ํ•ด, ์ด์ค‘ ํ‘์ƒ‰ ๋…ธ๋“œ๋ผ๋Š” ๊ฐœ๋…์„ ๋„์ž…ํ•ด ํŠน์„ฑ 5 ์œ„๋ฐ˜์„ ๋ฌด๋งˆํ•ด๋ฒ„๋ฆฐ๋‹ค.
์ž˜ ์ƒ๊ฐํ•ด๋ณด๋ฉด, X๊ฐ€ ๋ฌด์Šจ ์ƒ‰์ด์—ˆ๋“  ์ผ๋‹จ ํ‘์ƒ‰์œผ๋กœ ์น ํ•˜๋ฉด (ํ‘์ƒ‰์„ ํ•˜๋‚˜ ๋” ์ฃผ๋ฉด) ์›๋ž˜ ๊ฒฝ๋กœ์ƒ์˜ ํ‘์ƒ‰์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.

  1. ์›๋ž˜ X๊ฐ€ ์ ์ƒ‰์ด์—ˆ๋‹ค๋ฉด, ๋ฐ”๋กœ ์ „ ์ „ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๋‹จ์ˆœํžˆ X๋ฅผ ํ‘์ƒ‰์œผ๋กœ ์น ํ•ด์ฃผ๋Š” ๊ฒƒ์œผ๋กœ ๋ชจ๋“  ์œ„๋ฐ˜์ด ๋ณต๊ตฌ๋œ๋‹ค.
  2. ์›๋ž˜ 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)๊ฐ€ ์žˆ๋‹ค.

  1. w๊ฐ€ ์ ์ƒ‰์ธ ๊ฒฝ์šฐ.

    sibling(D)์„ ํ‘์ƒ‰์œผ๋กœ, parent(B)๋ฅผ ์ ์ƒ‰์œผ๋กœ ๋ฐ”๊พธ๊ณ , parent(B)๋ฅผ ๊ธฐ์ค€์œผ๋กœ LEFT-ROTATE ํ•œ๋‹ค.
    ๊ทธ๋Ÿฌ๋ฉด x์˜ new sibling(C)๋Š” ํ‘์ƒ‰์ด ๋˜๊ณ , ๊ฒฝ์šฐ 2,3,4 ์ค‘ ํ•˜๋‚˜๋กœ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.
    ์ด์ค‘ ํ‘์ƒ‰ ๋…ธ๋“œ๋Š” ์•„์ง ๋‚จ์•„์žˆ๋Š” ์ƒํƒœ์ด๋‹ค.
  1. w๊ฐ€ ํ‘์ƒ‰์ด๊ณ , w์˜ ์ž์‹๋“ค์ด ๋‘˜๋‹ค ํ‘์ƒ‰์ผ ๊ฒฝ์šฐ.

    c์˜ ์˜๋ฏธ๋Š” ์ ์ƒ‰, ํ‘์ƒ‰ ์ค‘์˜ ํ•˜๋‚˜๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค. x์™€ sibling ๋‘˜๋‹ค ํ‘์ƒ‰์ธ ์ƒํ™ฉ์ธ๋ฐ, ๊ฐ๊ฐ์—์„œ ํ‘์ƒ‰ ํ•˜๋‚˜์”ฉ์„ ๋นผ์™€์„œ (x์—์„  ์—ฌ๋ถ„์˜ ํ‘์ƒ‰, sibling์€ ์ž๊ธฐ๊ฐ€ ๊ฐ€์ง„ ํ‘์ƒ‰) parent(B)์— ์ „๋‹ฌํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์–‘์ชฝ ๊ฒฝ๋กœ์˜ ํ‘์ƒ‰ ๊ฐœ์ˆ˜๋Š” ๋ณ€ํ•˜์ง€ ์•Š์œผ๋ฉด์„œ, ์—ฌ๋ถ„์˜ ํ‘์ƒ‰์„ B์—๊ฒŒ ๋„˜๊ธธ ์ˆ˜ ์žˆ๋‹ค.
    ์ดํ›„์— parent(B)๋ฅผ ์ƒˆ๋กœ์šด x๋กœ ์‚ผ๊ณ  ๋ฐ˜๋ณต๋ฌธ์„ ๋‹ค์‹œ ์ง„ํ–‰ํ•˜๋Š”๋ฐ, parent(B)์˜ ์›๋ž˜ ์ƒ‰์ƒ์ด ์ ์ƒ‰์ด์—ˆ๋‹ค๋ฉด ๋ฐ˜๋ณต๋ฌธ์ด ์‹คํ–‰๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๊ณ , ํ‘์ƒ‰์ด์—ˆ๋‹ค๋ฉด ์ด์ค‘ ํ‘์ƒ‰ ๋…ธ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— (์—ฌ๋ถ„์˜ ํ‘์ƒ‰์„ ๋ฐ›์•˜์œผ๋ฏ€๋กœ) ๋ฐ˜๋ณต๋ฌธ์ด ๋‹ค์‹œ ์‹คํ–‰๋˜์–ด ๊ฒฝ์šฐ 1,2,3,4 ์ค‘ ์˜ ํ•˜๋‚˜๋กœ ์ฒ˜๋ฆฌ ๋  ๊ฒƒ์ด๋‹ค.
  1. w๊ฐ€ ํ‘์ƒ‰์ด๊ณ , w์˜ ์™ผ์ชฝ ์ž์‹์€ ์ ์ƒ‰, w์˜ ์˜ค๋ฅธ์ชฝ ์ž์‹์€ ํ‘์ƒ‰์ธ ๊ฒฝ์šฐ.

    ๊ฒฝ์šฐ 3์€ ๊ฒฝ์šฐ 4๋กœ ๋„˜์–ด๊ฐ€๊ธฐ ์œ„ํ•œ ์ค€๋น„๋‹จ๊ณ„์ด๋‹ค. ๊ฒฝ์šฐ 4์—์„œ๋Š” ๋ฐ˜๋ณต๋ฌธ์„ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ๋‹ค.
    sibling(D)์€ ์ ์ƒ‰์œผ๋กœ, sibling์˜ left-child(C)๋Š” ํ‘์ƒ‰์œผ๋กœ ์ƒ‰์„ ๋ฐ”๊พธ๊ณ , sibling(D)์— ๋Œ€ํ•ด RIGHT-ROTATE ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์œ„๋ฐ˜๋˜๋Š” ํŠน์„ฑ์€ ์—†๋‹ค. ์ดํ›„์— c๋ฅผ new sibling์œผ๋กœ ์„ค์ •ํ•˜๋ฉด, w๊ฐ€ ํ‘์ƒ‰์ด๊ณ  ์˜ค๋ฅธ์ชฝ ์ž์‹์ด ์ ์ƒ‰์ธ ๊ฒฝ์šฐ 4๋กœ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.
  1. 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

profile
I think I think too much.

0๊ฐœ์˜ ๋Œ“๊ธ€