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. w๊ฐ RED์ธ ๊ฒฝ์ฐ (w : x์ ํ์ ๋ ธ๋)
- w์ ์์๋ค์ black
- w๋ฅผ black์ผ๋ก, p[x]๋ฅผ red๋ก
- p[x]์ ๋ํด์ left-rotation ์ ์ฉ
- x์ ์๋ก์ด ํ์ ๋ ธ๋๋ ์๋ w์ ์์๋ ธ๋, ๋ฐ๋ผ์ black๋ ธ๋
- Case2,3, 4์ ํด๋น
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. w๋ black์ด๊ณ w์ ์ผ์ชฝ ์์์ด red
- w ๋ฅผ red๋ก, w์ ์ผ์ชฝ ์์์ black์ผ๋ก
- w์ ๋ํด์ right-rotation ์ ์ฉ
- x์ ์๋ก์ด ํ์ w๋ ์ค๋ฅธ์ชฝ ์์์ด red -> case4์ ํด๋น
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
'์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
13-3. ํด์ 3 (0) | 2020.11.29 |
---|---|
13-1๊ฐ. ํด์(Hashing) 1 (0) | 2020.11.24 |
12-1๊ฐ. ๋ ๋๋ธ๋ํธ๋ฆฌ(1) (0) | 2020.11.17 |
11-3๊ฐ. ์ด์ง๊ฒ์ํธ๋ฆฌ (Binary Search Tree) (3) | 2020.11.15 |
์ 11-1๊ฐ. ์ด์ง๊ฒ์ํธ๋ฆฌ(Binary Search Tree) (0) | 2020.11.10 |
๋๊ธ