๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜

12-2๊ฐ•. ๋ ˆ๋“œ๋ธ”๋ž™ํŠธ๋ฆฌ (3)

by devshin.kr 2020. 11. 22.
728x90
RB-DELETE(T, z) // T: Binary Search Tree, z : ์‚ญ์ œํ•  ๋…ธ๋“œ

if left[z] == nil[T] or right[z] == nil[T]	// ์ž์‹์ด ์—†๊ฑฐ๋‚˜, ์ž์‹์ด ํ•˜๋‚˜๊ฑฐ๋‚˜
	then y <-z	// ์‹ค์ œ ์ด ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๋ฉด ๋œ๋‹ค.
else y <- TREE-SUCCESSOR(z)	// ์ž์‹์ด ๋‘˜์ด๋ผ๋ฉด y๋Š” z์˜ SUCCESSOR๊ฐ€ ๋œ๋‹ค.

if left[y] != nil[T]	// ์ž์‹์ด ์ตœ๋Œ€ ํ•œ ๋ช…์ด๋ผ๋ฉด,
	then x <- left[y]	// x๋ฅผ ์™ผ์ชฝ ์ž์‹์ด๋ผ ํ•˜๊ณ ,
else x <- right[y]		// ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด x๋ฅผ ์˜ค๋ฅธ์ชฝ ์ž์‹์ด๋ผ ํ•œ๋‹ค.

p[x] <- p[y]	// x์˜ ๋ถ€๋ชจ๊ฐ€ y์˜ ๋ถ€๋ชจ๊ฐ€ ๋œ๋‹ค.
if p[y] == nil[T]
	then root[T] <- x
else if y == left[p[y]]	// ๋…ธ๋“œy๊ฐ€ ์ž๊ธฐ ๋ถ€๋ชจ์˜ ์™ผ์ชฝ ์ž์‹์ด๋ฉด
	then left[p[y]] <- x	// x๋Š” ์™ผ์ชฝ ์ž์‹์ด ๋˜๊ณ 
else right[p[y]] <-x	// ๊ทธ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด ์˜ค๋ฅธ์ชฝ ์ž์‹์ด ๋œ๋‹ค.
// ์—ฌ๊ธฐ๊นŒ์ง€๋Š” ์‚ญ์ œ ..

if y != z	// ์‹ค์ œ๋กœ ์‚ญ์ œํ•œ ๋…ธ๋“œ y๊ฐ€ ์‚ญ์ œํ•˜๋ ค ํ–ˆ๋˜ ๋…ธ๋“œ z๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ (z์˜ successor์„ ์‚ญ์ œํ•œ ๊ฒฝ์šฐ)
	then key[z] <- key[y]
    	copy y's satellite data into z
// ์—ฌ๊ธฐ๊นŒ์ง€๋Š” BST์—์„œ Deleteํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค..

if color[y] == BLACK	// ์‚ญ์ œํ•œ ๋…ธ๋“œ๊ฐ€ BLACK์ด์—ˆ์„ ๊ฒฝ์šฐ,	
	then RB-DELETE-FIXUP(T, x)	// X : ์‹ค์ œ๋กœ ์‚ญ์ œํ•œ ๋…ธ๋“œ์˜ ์ž์‹๋…ธ๋“œ

return y

 

  • ๋ ˆ๋“œ๋ธ”๋ž™ํŠธ๋ฆฌ์—์„œ์˜ DELETE

- ๋ณดํ†ต์˜ Binary Search Tree์—์„œ์ฒ˜๋Ÿผ DELETEํ•œ๋‹ค.

- ์‹ค์ œ๋กœ ์‚ญ์ œ๋œ ๋…ธ๋“œ y๊ฐ€ red๋ผ๋ฉด ์ข…๋ฃŒํ•œ๋‹ค.

- y๊ฐ€ black์ด์—ˆ์„ ๊ฒฝ์šฐ, RB-DELETE-FIXUP์„ ํ˜ธ์ถœํ•œ๋‹ค.

 

 

RB-DELETE-FIXUP(T, x) ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

1. ๋ชจ๋“  ๋…ธ๋“œ๋Š” RED or BLACK์ด์–ด์•ผ ํ•œ๋‹ค. => OK

2. y๊ฐ€ ๋ฃจํŠธ์˜€๊ณ , x๊ฐ€ red์ธ ๊ฒฝ์šฐ ์œ„๋ฐ˜

3. ๋ชจ๋“  NIL๋…ธ๋“œ๋Š” black์ด์–ด์•ผ ํ•œ๋‹ค. => OK

4. p[y] ์™€ x๊ฐ€ ๋ชจ๋‘ red์ผ ๊ฒฝ์šฐ ์œ„๋ฐ˜

5. ์›๋ž˜ y๋ฅผ ํฌํ•จํ–ˆ๋˜ ๋ชจ๋“  ๊ฒฝ๋กœ๋Š” ์ด์ œ black๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜ ๋ถ€์กฑํ•˜๋‹ค

   1) ๋…ธ๋“œ x์— "extra black"์„ ๋ถ€์—ฌํ•ด์„œ ์ผ๋‹จ ์กฐ๊ฑด5๋ฅผ ๋งŒ์กฑํ•œ๋‹ค

   2) ๋…ธ๋“œ x๋Š” "double black" ํ˜น์€ "red & black

 

- ์•„์ด๋””์–ด : 

   - extra black์„ ํŠธ๋ฆฌ์˜ ์œ„์ชฝ์œผ๋กœ ์˜ฌ๋ ค ๋ณด๋‚ธ๋‹ค

   - x๊ฐ€ red&black์ƒํƒœ๊ฐ€ ๋˜๋ฉด ๊ทธ๋ƒฅ black๋…ธ๋“œ๋กœ ๋งŒ๋“œ๋กœ ๋๋‚ธ๋‹ค

   - x๊ฐ€ ๋ฃจํŠธ๊ฐ€ ๋˜๋ฉด ๊ทธ๋ƒฅ extra black์„ ์ œ๊ฑฐํ•œ๋‹ค

 

- Loop Invariant

   - x๋Š” ๋ฃจํŠธ๊ฐ€ ์•„๋‹Œ double-black๋…ธ๋“œ

   - w๋Š” x์˜ ํ˜•์ œ๋…ธ๋“œ

   - w๋Š” NIL๋…ธ๋“œ๊ฐ€ ๋  ์ˆ˜ ์—†์Œ(์•„๋‹ˆ๋ฉด x์˜ ๋ถ€๋ชจ์— ๋Œ€ํ•ด ์กฐ๊ฑด 5๊ฐ€ ์œ„๋ฐ˜๋œ๋‹ค.)

 

 

 

Red-Black Tree์—์„œ delete๋Š” ์—ฌ๋Ÿ๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

๋„ค ๊ฐ€์ง€๋Š” ์™ผ์ชฝ, ๋„ค ๊ฐ€์ง€๋Š” ์˜ค๋ฅธ์ชฝ์ธ ๋Œ€์นญ์ ์ธ ๊ฒฝ์šฐ์ด๋‹ค.

 

case 1

Case 1. w๊ฐ€ RED์ธ ๊ฒฝ์šฐ (w : x์˜ ํ˜•์ œ๋…ธ๋“œ)

- w์˜ ์ž์‹๋“ค์€ black

- w๋ฅผ black์œผ๋กœ, p[x]๋ฅผ red๋กœ

- p[x]์— ๋Œ€ํ•ด์„œ left-rotation ์ ์šฉ

- x์˜ ์ƒˆ๋กœ์šด ํ˜•์ œ๋…ธ๋“œ๋Š” ์›๋ž˜ w์˜ ์ž์‹๋…ธ๋“œ, ๋”ฐ๋ผ์„œ black๋…ธ๋“œ

- Case2,3, 4์— ํ•ด๋‹น

 

 

case 2

Case 2. w๋Š” black์ด๊ณ  w์˜ ์ž์‹๋“ค๋„ black

- x์˜ extra-black์„ ๋นผ์•—๊ณ , w๋ฅผ red๋กœ ๋ฐ”๊พผ๋‹ค

- p[x]์—๊ฒŒ ๋นผ์•—์€ extra-black์„ ์ค€๋‹ค

- p[x]์„ ์ƒˆ๋กœ์šด x๋กœ ํ•ด์„œ ๊ณ„์†ํ•œ๋‹ค

- ๋งŒ์•ฝ Case1์—์„œ ์ด ๊ฒฝ์šฐ์— ๋„๋‹ฌํ–ˆ๋‹ค๋ฉด, p[x]๋Š” red์˜€๊ณ , ๋”ฐ๋ผ์„œ ์ƒˆ๋กœ์šด x๋Š”  red&black์ด ๋˜์–ด์„œ ์ข…๋ฃŒํ•œ๋‹ค.

(gray๋…ธ๋“œ๋Š” unknown color)

 

 

case 3

Case 3. w๋Š” black์ด๊ณ  w์˜ ์™ผ์ชฝ ์ž์‹์ด red

- w ๋ฅผ red๋กœ, w์˜ ์™ผ์ชฝ ์ž์‹์„ black์œผ๋กœ

- w์— ๋Œ€ํ•ด์„œ right-rotation ์ ์šฉ

- x์˜ ์ƒˆ๋กœ์šด ํ˜•์ œ w๋Š” ์˜ค๋ฅธ์ชฝ ์ž์‹์ด red -> case4์— ํ•ด๋‹น

 

 

case 4

Case 4. w๋Š”  black์ด๊ณ  w์˜ ์˜ค๋ฅธ์ชฝ ์ž์‹์ด red

- w์˜ ์ƒ‰์„ ํ˜„์žฌ p[x]์˜ ์ƒ‰์œผ๋กœ ํ•œ๋‹ค(unknown color)

- p[x]๋ฅผ black์œผ๋กœ, w์˜ ์˜ค๋ฅธ์ชฝ ์ž์‹์„ black์œผ๋กœ

- p[x]์— ๋Œ€ํ•ด์„œ left-rotation์„ ์ ์šฉํ•œ๋‹ค

- x์˜ extra-black์„ ์ œ๊ฑฐํ•˜๊ณ  ์ข…๋ฃŒํ•œ๋‹ค

 

 

 

Red-Black Tree Sudo Code

 

๋Œ“๊ธ€