๋ ๋-๋ธ๋ ํธ๋ฆฌ (Red-Black Tree)
์์ฝ๊ฒ๋ ์ด Rbt.๊ฐ ์๋๋๋ค.
0. ๋ชฉ์ฐจ
1. ๊ฐ๋ ์ ์
2. ๋ ๋-๋ธ๋ ํธ๋ฆฌ์ ๊ท์น 5๊ฐ์กฐ
3. ๋ ๋-๋ธ๋ ํธ๋ฆฌ์ ๋ ธ๋ ์ฝ์
4. ๋ ๋-๋ธ๋ ํธ๋ฆฌ์ ๋ ธ๋ ์ญ์
5. ๋ ๋-๋ธ๋ ํธ๋ฆฌ์ ๋ ธ๋ ๊ฒ์
6. ๊ธฐํ ํน์ง
7. ์ฐธ๊ณ ๋ฌธํ
1. ๊ฐ๋ ์ ์
๋ ๋-๋ธ๋ ํธ๋ฆฌ (Red-Black Tree, RBT)๋ ์ด์ง ํ์ ํธ๋ฆฌ(BST)์ ์ผ์ข ์ผ๋ก, ๋ ธ๋๋ง๋ค ์ (่ตค)๋๋ ํ(้ป)์์ ๋ง์ ํ ๊ท ํ์ ์ ์งํ๋ ์๋ฃ๊ตฌ์กฐ์ ๋๋ค. ์ด๋ฅผ ํตํด ์ฝ์ , ์ญ์ , ๊ฒ์์ด ์ต์ ์ ๊ฒฝ์ฐ์๋ O(log n)์ ๋ณด์ฅํฉ๋๋ค.
๋ ๋-๋ธ๋ ํธ๋ฆฌ์ ๋ ํนํ ํน์ง ์ค ํ๋๋ก NIL ๋ ธ๋๊ฐ ์์ต๋๋ค. RBT์์ ๋ชจ๋ ๋ฆฌํ ๋ ธ๋๋ NIL ๋ ธ๋๋ก ๋์ฒด๋ฉ๋๋ค. ์ฆ, ํธ๋ฆฌ๋ด ๋ชจ๋ ๋ฆฌํ๋ NULL์ด ์๋๋ผ (์ฆ, ๊ทธ๋ฅ ๋น์๋๋ ๊ฒ ์๋๋ผ) NIL ๋ ธ๋๊ฐ ๋๋๋ก ํฉ๋๋ค. ์ค์ ๊ตฌํ ์ ํธ๋ฆฌ ์ ์ฒด์ ํ๋๋ฟ์ธ NIL ๋ ธ๋๋ฅผ root์ ๋ฐฐ์นํ๊ณ , key๊ฐ ์๋ ์ ์์ ์ธ ๋ ธ๋๊ฐ ์์์ด ์์ ๋ NULL ๋์ ์ด NIL ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค. NIL ๋ ธ๋๋ ์์ธ์์ด ํ์์ ๋๋ค.
์ฐธ๊ณ ๋ก ์ฌ๊ธฐ์ NIL์ ํน๋ณํ ์ด๋ ํ ์ฝ์๋ ์๋๋ฉฐ, ํ๋ฌด, ๊ณตํ, nothing, zero, empty ๋ฑ์ ์๋ฏธํ๋ ๋ผํด์ด 'nihil'์์ ์ ๋ํ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. ์ด nihil์ ํํ ๋งํ๋ '๋ํ๋ฆฌ์ฆ (ํ๋ฌด์ฃผ์)' ๊ฐ์ ๋จ์ด์์ ๊ทธ ์ฉ๋ก๋ฅผ ์ฐพ์๋ณผ ์ ์์ต๋๋ค.
2. ๋ ๋-๋ธ๋ ํธ๋ฆฌ์ ๊ท์น 5๊ฐ์กฐ
๋ ๋-๋ธ๋ ํธ๋ฆฌ๋ ์๋ 5๊ฐ ๊ท์น์ ํญ์ ๋ง์กฑ์์ผ์ผ๋ง ํฉ๋๋ค. ๋ง์กฑํ๋๋ก ๋ง๋๋ ๊ณผ์ ์ด ๊ณง ๊ท ํ์ ์ก๋ ๊ณผ์ ๊ณผ ๊ฐ์ต๋๋ค.
1์กฐ. ๋ชจ๋ ๋ ธ๋๋ ์ ์ ๋๋ ํ์.
2์กฐ. ๋ฃจํธ๋ ๋ฐ๋์ ํ์.
3์กฐ. ๋ชจ๋ ๋ฆฌํ ๋ ธ๋๋ ํ์ NIL์ด๋ค.
4์กฐ. Red-red ๊ธ์ง. ์ ์ ๋ ธ๋์ ์์์ ๋ฐ๋์ ํ์์ด๋ค. (์ฆ, ์ฐ์ด์ ์ ์ ๋ ธ๋ ๋ถ๊ฐ)
5์กฐ. Black-height ๋์ผ์ ์์น: ์์์ ๋ ธ๋์์ ์์์ธ NIL ๋ ธ๋๊น์ง์ ๋ชจ๋ ๊ฒฝ๋ก์์, ๊ฑฐ์น๋ ํ์ ๋ ธ๋ ์๋ ๋ชจ๋ ๋์ผํด์ผ ํ๋ค. ๋จ, ์๊ธฐ ์์ ์ ์นด์ดํธ์์ ์ ์ธ.
'Black-Height ๋์ผ์ ์์น'์ ๊ฒฝ์ฐ ์๋ ์์๋ฅผ ๋ด์ฃผ์ธ์.
๊ฐ๋ น ๋ ธ๋ 19๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ณด๋ฉด, NIL์ ๋๋ฌํ๊ธฐ๊น์ง์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์ (19-18-NIL, 19-75-24-NIL, 19-75-81-NIL)์ ๊ณผ์ ์์ ๊ฑฐ์ณ๊ฐ๋ BLACK์ ์๋ 2๊ฐ๋ก ๋์ผํฉ๋๋ค. ์ด๋ ๋ฃจํธ ๋ ธ๋์ธ 17์ ๊ธฐ์ค์ผ๋ก ์ธ์ด๋ด๋ ๋์ผํฉ๋๋ค (์๊ธฐํ๋ฏ ์๊ธฐ ์์ ์นด์ดํธ x).
์๊ธฐ ๊ท์น๋ค์ ๋ง์กฑํ๋๋ก ์กฐ์ํ๋ ๊ณผ์ ์์ ๋ ๋-๋ธ๋ ํธ๋ฆฌ์ ๊ท ํ ์ ์ง๊ฐ ๋ณด์ฅ๋ฉ๋๋ค.
3. ๋ ๋-๋ธ๋ ํธ๋ฆฌ์ ์ฝ์
์ ๋ ธ๋์ ์ฝ์ ๊ณผ์ ์์ฒด๋ ์ผ๋ฐ์ ์ธ BST์ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋, RBT์ ๊ฒฝ์ฐ ์ฝ์ ํ '๋ณต๊ตฌ ๊ณผ์ '์ ๋ฐ๋ก ๊ฑฐ์ณ์ผ ํฉ๋๋ค. ๋ณต๊ตฌ ๊ณผ์ ์ ๋ํด์๋, ๊ตฌ๋ถํ๊ธฐ ์ฝ๋๋ก ์์ ์ฒ๋ฆฌ - ๋ฐ๋ณต ์ผ์ด์ค I - ๋ฐ๋ณต ์ผ์ด์ค II - ๋ฐ๋ณต ์ผ์ด์ค III - ์ข ๋ฃ ์ฒ๋ฆฌ๋ก ์นญํฉ๋๋ค. ์ถ๊ฐ๋ก, ๋ฐ๋ณต ์ผ์ด์ค II์ III์์๋ 'ํ์ '์ด๋ผ๋ ๊ฐ๋ ์ด ๋ฑ์ฅํ๋๋ฐ ์ด์ ๋ํด์๋ ์๋์์ ๋ค๋ฃจ๊ฒ ์ต๋๋ค.
3.1. ์์ ์ฒ๋ฆฌ
๋ณต๊ตฌ ๊ณผ์ ์ ์์์, ์ ๋ ธ๋์ ์ฝ์ ์์น์ ๋ถ๋ชจ๊ฐ RED์ธ์ง ํ์ธํ๋ ๊ฒ์ ๋๋ค. ๋ถ๋ชจ๊ฐ RED์ผ ๋๋ง ๋ฐ๋ณต ์ผ์ด์ค๋ก ๋ค์ด๊ฐ๋๋ก ํฉ๋๋ค. ์๋ ๊ฒฝ์ฐ ๋ฐ๋ก ์ข ๋ฃ ์ฒ๋ฆฌ๋ก ๋์ด๊ฐ๋๋ค.
3.2. ๋ฐ๋ณต ์ผ์ด์ค 3๊ฐ
์ ๋ ธ๋๊ฐ ๋ฃจํธ๊ฐ ์๋ ๊ฒฝ์ฐ, ๋ฌด์กฐ๊ฑด ์ ์์ผ๋ก ํ์ฌ ์ถ๊ฐํฉ๋๋ค. ์ด ๊ณผ์ ์์ ์๊ธฐ 5๊ฐ ์กฐํญ์ ์๋ฐํ ์ ์์ต๋๋ค. ๊ทธ๋ ๊ธฐ์ ์๋ ์ผ์ด์ค๋ค์ ์ฐจ๋ก๋ก ๊ฒ์ฌ ๋ฐ ์ฒ๋ฆฌํ์ฌ ์๋ฐ ์ฌํญ์ ํด๊ฒฐํฉ๋๋ค. ๋ง์ฝ ๋ถ๋ชจ๊ฐ RED๊ฐ ์๋ ๊ฒฝ์ฐ ๋ฐ๋ณต ์ผ์ด์ค๋ค์ ๋ฌด์ํฉ๋๋ค.
์ผ์ด์ค | ์กฐ๊ฑด ์ค๋ช | ์ฒ๋ฆฌ ๋ฐฉ๋ฒ |
---|---|---|
I | ๋ถ๋ชจ RED, ์ผ์ด RED | ์ฌ์ฑ์(๋ถ๋ชจ, ์ผ์ด์ BLACK๋ก, ์กฐ๋ถ๋ชจ๋ RED๋ก) |
II | ๋ถ๋ชจ RED, ์ผ์ด BLACK, ์ผ๊ฐํ ํํ | ๋ถ๋ชจ๋ฅผ ์ถ์ผ๋ก ์ขํ์ /์ฐํ์ ํ์ฌ ์ผ์ํ์ผ๋ก ๋ง๋ฆ |
III | ๋ถ๋ชจ RED, ์ผ์ด BLACK, ์ผ์ ํํ | ์กฐ๋ถ๋ชจ๋ฅผ ์ถ์ผ๋ก ์ขํ์ /์ฐํ์ ํ ์ ๊ตํ |
์ค์ ๋ก๋ ์ข์ฐ ๋์นญ์ผ๋ก ์กด์ฌํ๋ ๊ตฌํ ์ ์ด 6๊ฐ ์ผ์ด์ค์ ๋ํ์ฌ ์์ฑํ๊ฒ ๋ฉ๋๋ค. ์ด ์ผ์ด์ค๋ค์ ๋ํ์ฌ ์๋์์ ๋ ์์ธํ ์ดํด๋ณด์๊ฒ ์ต๋๋ค.
์, ์์ผ๋ก ๋์ฌ ๋ฑ์ฅ์ธ๋ฌผ์ ์ด๋์ ์ ์๊ฐํฉ๋๋ค. G, P, U, N. ์์๋๋ก ์กฐ๋ถ๋ชจ, ๋ถ๋ชจ, ์ผ์ด, ์ ๋ ธ๋์ ๋๋ค.
3.2.1. ๋ฐ๋ณต ์ผ์ด์ค I: ๋ถ๋ชจ์ ์๋ถ๊ฐ ๋ ๋ค R์ธ ๊ฒฝ์ฐ (์ฌ์ฑ์)
- ์๋ก ์ฝ์ ํ๋ ๋ ธ๋๋ฅผ N์ด๋ผ ๊ฐ์ . ์์์ ์ธ๊ธ ๋๋ ธ๋ฏ ์ ๋ ธ๋๋ R์์ ๋๋ค.
- ์ด๋ ๋ถ๋ชจ P๊ฐ R์์ด๋ฉด, ๋ถ๋ชจ๋ R์ ์์๋ R์. ์ฆ, RedโRed (๊ท์น #4) ์๋ฐ์ด ๋ฐ์ํฉ๋๋ค.
Case 1:
(G,B) ← ์กฐ๋ถ๋ชจ G
๏ผ ๏ผผ
(P,R) (U,R) ← ๋ถ๋ชจ P, ์๋ถ U
๏ผ
(N,R) ← ์๋ก ์ฝ์
๋ ๋
ธ๋ N
ํด๊ฒฐํ๊ธฐ ์ํด ์๋์ ๊ฐ์ด ์ํํฉ๋๋ค. ์ด๋ฅผ ํตํด Red-Red ์๋ฐ์ ํด๊ฒฐํ ์ ์์ต๋๋ค.
- P์ U๋ฅผ BLACK์ผ๋ก ๋ณ๊ฒฝ
- G๋ฅผ RED๋ก ๋ณ๊ฒฝ
- ํ์ฌ ํ์ ์ค์ธ ๋ ธ๋๋ฅผ ๊ทธ์ ์กฐ๋ถ๋ชจ๋ก ๋ฐ๊พผ ๋ค, ๋ฐ๋ณต๋ฌธ์ ์ฒ์์ผ๋ก
3.2.2. ๋ฐ๋ณต ์ผ์ด์ค II: ์ผ๊ฐํ (triangle) ๋ชจ์์ผ ์ ํ์
- ๋ถ๋ชจ P๋ R์, ์๋ถ U๋ B์(๋๋ NIL)์ ๋๋ค.
- N์ด P์ ์ค๋ฅธ์ชฝ (๋๋ ์ผ์ชฝ ์์)์ธ ์ผ๊ฐํ ๋ชจ์์ ๋๋ค.
Case 2 (์ผ์ชฝ-์ผ๊ฐํ ์์):
(G,B) ← ์กฐ๋ถ๋ชจ G
๏ผ ๏ผผ
(P,R) (U,B) ← ๋ถ๋ชจ P(ํ์ ์ถ), ์๋ถ U
๏ผผ
(N,R) ← ์๋ก ์ฝ์
๋ ๋
ธ๋ N
ํด๊ฒฐํ๊ธฐ ์ํด, ์ด ์ผ๊ฐํ ๊ตฌ์กฐ๋ฅผ ์ผ์ ํํ๋ก ํ ๋๋ค. ์ ์ฒด ๊ณผ์ ์ ์๋์ ๊ฐ์ต๋๋ค.
- ํ์ : '์ผ์ชฝ-์ผ๊ฐํ (G → P ์ผ์ชฝ → N ์ค๋ฅธ์ชฝ)'์ด๋ฉด, ๋ถ๋ชจ P๋ฅผ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ ํ์ (leftRotate(P)). '์ค๋ฅธ์ชฝ-์ผ๊ฐํ (G → P ์ค๋ฅธ์ชฝ → N ์ผ์ชฝ)'์ด๋ฉด, ๋ถ๋ชจ P๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ฅธ์ชฝ ํ์ (rightRotate(P)).
- ์๋ก์ด N ์ง์ (ํ์ ํ N ← P๋ก ์ฌ์ง์ )
- ๋ค์ ๋จ๊ณ๋ก ์ด๋ (์ผ์ ํํ๊ฐ ๋์์ผ๋ฏ๋ก, ์ผ์ ํํ๋ฅผ ์ฒ๋ฆฌํ๋ ์ผ์ด์ค III๋ก ๋๊น)
์ '์ผ์ชฝ-์ผ๊ฐํ' ์์์ ๊ฒฝ์ฐ ๋ถ๋ชจ(P)๋ฅผ ์ถ์ผ๋ก ์ผ์ชฝ ํ์ ์ด ํ์ํ๋ฉฐ, ํ์ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ์ต๋๋ค.
P๋ฅผ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ ํ์ ๊ฒฐ๊ณผ:
(G,B) ← ์กฐ๋ถ๋ชจ G
/ \
(N,R) (U,B) ← ์ ๋
ธ๋ N, ์๋ถ U
/
(P,R) ← ๋ถ๋ชจ P (ํ์ ์ถ)
3.2.3. ๋ฐ๋ณต ์ผ์ด์คโฏIII: ์ผ์ (line) ๋ชจ์์ผ ๋ ํ์ ๋ฐ ์์ ์ค์
- ์์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ถ๋ชจ P๋ R์, ์๋ถ U๋ B์(๋๋ NIL)์ ๋๋ค.
- "์ผ์ชฝ–์ผ์ชฝ(LeftโLeft)" ๋ชจ์, ์ฆ, N์ด P์ ์ผ์ชฝ ์์์ด๋ฉด์ P๊ฐ G์ ์ผ์ชฝ ์์์ธ "์ผ์ชฝ–์ผ์ชฝ(LeftโLeft)" ๋ชจ์์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค. (๋๋ ๋์นญ์ผ๋ก "์ค๋ฅธ์ชฝ–์ค๋ฅธ์ชฝ" ๋ชจ์)
Case 3 (LeftโLeft ์์):
(G,B) ← ์กฐ๋ถ๋ชจ G(ํ์ ์ถ)
๏ผ ๏ผผ
(P,R) (U,B) ← ๋ถ๋ชจ P, ์๋ถ U
๏ผ
(N,R) ← ์๋ก ์ฝ์
๋ ๋
ธ๋ N
ํด๊ฒฐํ๊ธฐ ์ํด G์ P์ ์์ ์๋ก ๊ตํํ์ฌ ๊ท ํ์ ๋ณต๊ตฌํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์กฐ๋ถ๋ชจ G๋ฅผ ์ถ์ผ๋ก ๋จ์ผ ํ์ ํฉ๋๋ค. ํ์ ๊ณผ ์ ๊ตํ๋ง์ผ๋ก ํธ๋ฆฌ์ ๋ชจ๋ ๊ฒฝ๋ก์์ black-height๋ฅผ ์ ์ง ๋ฐ red-red ์๋ฐ์ ํด๊ฒฐํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์กฐ์์ผ๋ก ์ ํ๋ ๊ฒ์ด ์์ ์ ์์ผ๋ฏ๋ก ๋ฐ๋ณตํด์ผ ํฉ๋๋ค.
- G์ P์ ์์ ๋ง๋ฐ๊ฟ
- Left-left ๊ตฌ์กฐ์ผ ์ G๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ฅธ์ชฝ ํ์ (rightRotate(G)). ๋จ, right-right ๊ตฌ์กฐ๋ผ๋ฉด G๋ฅผ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ ํ์
- P๊ฐ RED์ผ ๊ฒฝ์ฐ ๋ฐ๋ณต๋ฌธ์ ์ฒ์์ผ๋ก
์ '์ผ์ชฝ-์ผ์ชฝ ๋ผ์ธ' ์์์ ๊ฒฝ์ฐ ์กฐ๋ถ๋ชจ(G)๋ฅผ ์ถ์ผ๋ก ์ค๋ฅธ์ชฝ ํ์ ์ด ํ์ํ๋ฉฐ, ํ์ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ์ต๋๋ค.
G๋ฅผ ์ถ์ผ๋ก ์ค๋ฅธ์ชฝ ํ์ ๊ฒฐ๊ณผ:
(P,R) ← ๋ถ๋ชจ P
๏ผ ๏ผผ
(N,R) (G,B) ← ์ ๋
ธ๋ N, ์กฐ๋ถ๋ชจ G(ํ์ ์ถ)
๏ผผ
(U,B) ← ์๋ถ U
3.2.4. ๋ฐ๋ณต 3๊ฐ ์ผ์ด์ค๋ฅผ ๋ณด๋ ๋๋ ์๋ฌธ์ .
'๋ถ๋ชจ BLACK, ์ผ์ด RED' ๊ฐ์ ๊ฒฝ์ฐ๋ ๋ฐ๋ก ๋์ํ์ง ์๋์? ๋ค, ๋์ํ ํ์๊ฐ ์์ต๋๋ค. ์๋ก ์ฝ์ ๋๋ ๋ ธ๋๋ ๋ฌด์กฐ๊ฑด RED์ด๋ฏ๋ก, ๋ถ๋ชจ BLACK, ์์ RED. ์๊ธฐ ๊ท์น 5๊ฐ์กฐ์ ์ด๊ธ๋๋ ๋ฐ๊ฐ ์์ต๋๋ค.
3.3. ์ข ๋ฃ ์ฒ๋ฆฌ
๋ฐ๋ณต์ ํ์ถํ๋๋ฐ ๋ฃจํธ๊ฐ ์ ์์ด๋ผ๋ฉด, ์ด๋ฅผ ํ์์ผ๋ก ์ฌ์ฑ์ํ๊ณ ์ข ๋ฃํฉ๋๋ค.
3.4. ์ ๊น, ์ผ์ชฝ/์ค๋ฅธ์ชฝ ํ์ ์ด๋?
ํธ๋ฆฌ ํ์ ์ ์ด์ง ํ์ ํธ๋ฆฌ(BST)์ ๊ตฌ์กฐ๋ฅผ ์ฌ์กฐ์ ํ๋ฉด์ BST์ ํน์ง(์ผ์ชฝ ์์ ≤ ๋ถ๋ชจ ≤ ์ค๋ฅธ์ชฝ ์์) ์ ์ ์งํ๋ ์ฐ์ฐ์ ๋๋ค. ๋ ๋-๋ธ๋ ํธ๋ฆฌ๋ฟ๋ง ์๋๋ผ AVL ํธ๋ฆฌ ๋ฑ self-balancing BST (๊ท ํ์ ์ค์ค๋ก ๋์ฐพ๋ BST)์์ ๋์ด ๊ท ํ์ ๋ง์ถ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
์ผ๋ฐ์ ์ธ BST์์๋, ์ฝ์ /์ญ์ ํ, BST ์์ฑ์ ์ด๊ธ๋๊ฒ ๋ ๊ฒฝ์ฐ ํ์ ์ ์ํต๋๋ค (๋ถ๋ชจ > ์ค๋ฅธ์ชฝ ์์, ๋ถ๋ชจ < ์ผ์ชฝ ์์ ๋ฑ). ํํธ ๋ ๋-๋ธ๋ ํธ๋ฆฌ์ ์ฝ์ ์ ๊ฒฝ์ฐ ์๊ธฐ ๋ฐ๋ณต ์ผ์ด์ค I, II, III๋ฅผ ์ฒ๋ฆฌํ๋ ๊ณผ์ ์์ ์์ฐ์ค๋ฝ๊ฒ ์ํ์ํค๊ฒ ๋ฉ๋๋ค.
3.4.1. ์ผ์ชฝ ํ์
์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ๊ฐ ๋ฌด๊ฑฐ์ธ ๋, ๊ท ํ์ ๋ง์ถ๊ธฐ ์ํด ์ผ์ชฝ์ผ๋ก ๊บพ์ต๋๋ค.
R ← N.right
N.right ← R.left
R.parent ← N.parent
(R
๊ฐ ๋ฃจํธ๊ฐ ๋๊ฑฐ๋, ๋ถ๋ชจ์ ์์ ํฌ์ธํฐ๋ฅผ ์์ )R.left ← N
N.parent ← R
์ผ์ชฝ ํ์ ์๋์ฝ๋๋ ์๋์ ๊ฐ์ต๋๋ค.
function leftRotate(T, x):
y = x.right
x.right = y.left
if y.left ≠ nil:
y.left.parent = x
y.parent = x.parent
if x.parent == nil:
T.root = y
else if x == x.parent.left:
x.parent.left = y
else:
x.parent.right = y
y.left = x
x.parent = y
3.4.2. ์ค๋ฅธ์ชฝ ํ์ (Right Rotate)
์ผ์ชฝ ์๋ธํธ๋ฆฌ๊ฐ ๋ฌด๊ฑฐ์ธ ๋, ๊ท ํ์ ๋ง์ถ๊ธฐ ์ํด ์ค๋ฅธ์ชฝ์ผ๋ก ๊บพ์ต๋๋ค.
L ← N.left
N.left ← L.right
L.parent ← N.parent
(L
๊ฐ ๋ฃจํธ๊ฐ ๋๊ฑฐ๋, ๋ถ๋ชจ์ ์์ ํฌ์ธํฐ๋ฅผ ์์ )L.right ← N
N.parent ← L
์ค๋ฅธ์ชฝ ํ์ ์๋์ฝ๋๋ ์๋์ ๊ฐ์ต๋๋ค.
function rightRotate(T, y):
x = y.left
y.left = x.right
if x.right ≠ nil:
x.right.parent = y
x.parent = y.parent
if y.parent == nil:
T.root = x
else if y == y.parent.left:
y.parent.left = x
else:
y.parent.right = x
x.right = y
y.parent = x
3.4.3. ํ์ ์ ๊ธฐํ ํน์ง
- ๋ ๋โ๋ธ๋ ํธ๋ฆฌ๋ฟ๋ง ์๋๋ผ AVL ํธ๋ฆฌ ๋ฑ BST ์ ๋ฐ์ ์ผ๋ก ์๋ธํธ๋ฆฌ์ ๊ท ํ์ ๋ง์ถ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ๋ ธ๋๋ฅผ “๊บพ์ด์” ํธ๋ฆฌ์ ๋ชจ์์ ๋ฐ๊ฟ์ค๋๋ค.
- ํ์ ์์ฒด๋ก๋ ์์ด ๋ฐ๋์ง ์์ต๋๋ค (black-height๋ฅผ ์ ์ง).
- O(1) ์ฐ์ฐ์ผ๋ก ์ํ๋ฉ๋๋ค.
3.5. ๋ณต๊ตฌ ๊ณผ์ ์๋์ฝ๋
4. ๋ ๋-๋ธ๋ ํธ๋ฆฌ์ ์ญ์
์ฝ์ ์ ํ์ผ๋ ์ด์ ์ญ์ ๋ฅผ ํด์ผ๊ฒ ์ง์? ์ญ์ ์ญ์ ์ผ๋ฐ์ ์ธ BST์ ๊ณผ์ ์ ๊ทธ๋๋ก ๋ฐ๋ฆ ๋๋ค๋ง, ๊ทธ ํ ์ญ์ ๋ณต๊ตฌ ๊ณผ์ ์ ํตํด RBT์ ์๊ธฐ ๊ท์น 5๊ฐ์ ์งํค๋๋ก ํด์ผ ํฉ๋๋ค. ์ญ์ ๋ณต๊ตฌ ๊ณผ์ ์ ๋จผ์ ์์ฑ ์๋ฐ ์ฌ๋ถ์ ํ์ธ์์๋ถํฐ ์์ํฉ๋๋ค.
4.1.โฏ๊ฐ์ — ์ ‘์ญ์ ’๊ฐ ๊น๋ค๋ก์ด๊ฐ?
์ด๋ฏธ BST ์ญ์ ์์ฒด๋ ์ถฉ๋ถํ ๋ณต์กํ๋ฐ, ์ฌ๊ธฐ์ ๋ํด RBT๋ ์๊น์ง ๋ด์ผ ํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ ์์ธํ๊ฒ๋, ์ผ๋ฐ BST์ ์ญ์ ์ ๋ง์ฐฌ๊ฐ์ง๋ก, 1)โฏ์ญ์ ์์ฒญ๋ฐ์ ๋
ธ๋โฏz
โฏ์ ํ → 2)โฏz
๊ฐ ์์ ≤ 1๊ฐ๋ฉด ๋ฐ๋ก ์ ๊ฑฐ, ์์ 2๊ฐ๋ฉด ํ๊ณ์ y
์ ๊ตํ ํ y
๋ฅผ ์ ๊ฑฐ๊น์ง๋ ๋์ผํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฐจ์ด๊ฐ ์๊ธฐ๋ ์ง์ ์ “ํธ๋ฆฌ์์ ์ค์ ๋ก ์ญ์ ๋๋ ๋
ธ๋์โฏ์”์
๋๋ค.
(์ ์)์ ํ์ / (์ค์)ํ๊ณ์๋?BST์์ ์ด๋ค ๋ ธ๋ z๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค์ ์ํ(in-order traversal) ์,
์ ํ์(in-order predecessor)๋, z์ ์ข์ธก ์๋ธํธ๋ฆฌ์ ๊ฐ์ฅ ์ฐ์ธก ๋ ธ๋. ๋ค์ ๋งํ์ฌ, z๋ณด๋ค ์์ ๊ฐ ์ค ๊ฐ์ฅ ์ต๋๊ฐ์ธ ๋ ธ๋์ด์, ์ค์ ์ํ ์ z ์ด์ ์ ์ถ๋ ฅ๋ ๋ ธ๋. ์๋ฅผ ๋ค์ด ์ ํธ๋ฆฌ์ 4์ ์ ํ์๋ 3์ ๋๋ค.
ํ๊ณ์(in-order successor)๋, z์ ์ฐ์ธก ์๋ธํธ๋ฆฌ์ ๊ฐ์ฅ ์ข์ธก ๋ ธ๋. ๋ค์ ๋งํ์ฌ, z๋ณด๋ค ํฐ ๊ฐ ์ค ์ต์๊ฐ์ธ ๋ ธ๋์ด์, ์ค์ ์ํ ์ z ๋ค์์ผ๋ก ์ถ๋ ฅ๋ ๋ ธ๋. ์๋ฅผ ๋ค์ด ์ ํธ๋ฆฌ์ 4์ ํ๊ณ์๋ 5์ ๋๋ค.
์ด ๊ฐ๋ ์ ํนํ, ์ญ์ ํ ๋ ธ๋์ ์์์ด ๋์ผ ๋, ํด๋น ๋ ธ๋๋ฅผ ์ง์ ์ญ์ ํ์ง ์๊ณ ๊ฐ์ ๊ตํํ ๋ค, ํ๊ณ์(๋๋ ์ ํ์)๋ฅผ ์ค์ ๋ก ์ญ์ ํ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
์๋๋ ์ ํ์/ํ๊ณ์ ํ์์ ํ์ํ Tree-Minimum ๋ฐ Tree-Maximum์ ์ฐพ๋ ๊ฐ๋จํ ์๋์ฝ๋์ ๋๋ค.๋๋ณด๊ธฐfunction TREE-MAXIMUM(t, x): while x.right != t.nil: x ← x.right return x
function TREE-MINIMUM(t, x): while x.left != t.nil: x ← x.left return x
๋ ธ๋์ ์ | ๋ฌธ์ ์ฌ๋ถ | ์์ธ |
---|---|---|
RED | ๋ฌธ์ ์์ | ๊ท์น #4 (์ฐ์ RED ๊ธ์ง), #5 (black-height ๋ณด์กด)์ ์ผ๊ด์ฑ ์ ์ง ๊ฐ๋ฅ |
BLACK | ๋ฌธ์ ๋ฐ์ | ์ญ์ ๋ก ์ธํด ํด๋น ๊ฒฝ๋ก์ blackโheight๊ฐ 1โฏ์ค์ด๋ค์ด ๊ท์น #5๊ฐ ๊นจ์ง |
์ฆ, BLACKโฏ๋ ธ๋์ ์ ๊ฑฐ๋ก ์ธํ blackโheightโฏ๋ถ๊ท ํ์ ๋ณต๊ตฌํ๋ ๊ณผ์ ์ด ํ์ํฉ๋๋ค.
4.2. ๋ฑ์ฅ์ธ๋ฌผ ์๊ฐ
๋ ธ๋ ์ญ์ ์ ๊ฒฝ์ฐ ๋ฑ์ฅ์ธ๋ฌผ์ด ๋ง์ฅ๋๋ผ๋ง๋ฅผ ๋ฐฉ๋ถ์ผ ํ ์ ๋๋ก ๋ณต์กํฉ๋๋ค. ์๋์ ๊ฐ์ด ํ๋ก ์ ๋ฆฌํด๋๋ฆฝ๋๋ค.
๊ธฐํธ | ์ญํ | ์ค๋ช |
---|---|---|
z |
์ญ์ ์์ฒญ ๋ ธ๋ | ์ฌ์ฉ์๊ฐ ์ญ์ ํ๋ ค๊ณ ํ ๋ ธ๋. ์์์ด ๋์ด๋ฉด ์ค์ ๋ก๋ ์ญ์ ๋์ง ์์. |
y |
์ค์ ๋ก ์ ๊ฑฐ๋๋ ๋ ธ๋ | ํธ๋ฆฌ์์ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ ๊ฑฐ๋๋ ๋
ธ๋. z ๋๋ z์ ์ค์ ํ๊ณ์. y.color ๊ฐ BLACK์ด๋ฉด ๋ณต๊ตฌ(delete-fix-up)๊ฐ ํ์. |
x |
y ์ ์๋ฆฌ๋ฅผ ๋์ ํ ๋
ธ๋ |
y์ ์์ (๋๋ NIL). delete-fix-up() ์ ์์ ์ง์ . ๋ถ๊ท ํ์ด ๋ฐ์ํ ์์น๋ก, ๋ฃจํ๋ฅผ ํตํด black-height๋ฅผ ๋ณต๊ตฌํ๋ค. |
p |
x ์ ๋ถ๋ชจ |
๋ฃจํ ์ค ์์ ๋
ธ๋. x ๊ฐ root๊ฐ ์๋๋ผ๋ฉด ํญ์ ์กด์ฌ. ๋ฐ๋ณต๋ฌธ์์ ๊ธฐ์ค์ด ๋จ. |
w (๋๋ s ) |
x ์ ํ์ |
ํต์ฌ ํ๋จ ๋์. ์๊ณผ ์์์ ์์ ๋ฐ๋ผ ์ผ์ด์ค I-IV๋ฅผ ๊ฒฐ์ ํ๋ค. |
w.left w.right |
ํ์ ์ ์์๋ค | ์ด๋ค์ RED/BLACK ์ฌ๋ถ๋ก ํ์ ๋ฐฉํฅ ๋ฐ ์์ ์กฐ์ ์ฌ๋ถ๊ฐ ๊ฒฐ์ ๋จ. |
T.root |
ํธ๋ฆฌ์ ๋ฃจํธ | ๋ณต๊ตฌ ๊ณผ์ ์ ์ข
๋ฃ ์กฐ๊ฑด ์ค ํ๋. x == T.root ์ด๋ฉด ๋ฃจํ ์ข
๋ฃ. |
4.3. ์ญ์ ์ ์ฐจ์ ํ๋ฆ
- ์ผ๋ฐ์ ์ธ BSTโฏ์ญ์ ๊ณผ์ ๊ณผ ๋น์ทํ๊ฒ ์ํ
- ์ญ์ ์์ฒญ๋ฐ์ ๋
ธ๋
z
์ ํ - ์ค์ ๋ก ์ ๊ฑฐ๋ ๋
ธ๋
y
๊ฒฐ์ - ๋ง์ฝ
z
์ ์์์ด 0๊ฐ๋ฉด,y=z
. - 1๊ฐ๋ฉด,
y=z; x=(y์ ์์)
. - 2๊ฐ๋ฉด,
y=(y์ ์ค์ํ๊ณ์); x=y->right
.
- ๋ง์ฝ
y.color
๋ฅผy_original_color
๋ก ๋ณด๊ดTRANSPLANT(T, y, x)
ํธ์ถ: ํธ๋ฆฌ๋ก๋ถํฐy
๋ฅผ ๋ผ์ด๋ด๊ณ , ๊ทธ ์๋ฆฌ์x
๋ฅผ ๋ถ์ (BST์ ์ด์ ๊ด๋ จ ๊ฐ๋ ์ฐธ์กฐ)- ์ญ์ ๋ ๋ ธ๋์ ์๊น(y_original_color)์ด RED๋ฉด ์ฌ๊ธฐ์ ์ข ๋ฃ
- ์ญ์ ์์ฒญ๋ฐ์ ๋
ธ๋
y_original_color == BLACK
์ด๋ฉดโฏdeleteโfixโup(T,โฏx)
x
๋ “blackโheight ๋ถ๊ท ํ์ด ์ ํ๋ ์ง์ ”- ์ดํ fixup ๊ณผ์ ์ ์๋ 4.4. ์ฐธ์กฐ
- (C/C++ ๋ฑ ๋ฉ๋ชจ๋ฆฌ ์กฐ์ ํ์ ์) ๋ฉ๋ชจ๋ฆฌ ํด์
์๋๋ ์ด์ ํจ์์ ๊ฐ๋จํ RBT ๋ฒ์ ์๋์ฝ๋์ ๋๋ค.
function RB-TRANSPLANT(T,u,v):
if u.p == T.nil:
T.root ← v
else if u == u.p.left:
u.p.left ← v
else u.p.right ← v
v.p ← u.p
4.4.โฏ์ญ์ โฏ๋ณต๊ตฌ์ ์ผ์ด์ค 4๊ฐ์ง
โป ์๋ ํ๋ “P๊ฐ ๋ถ๋ชจ, x๋ ์ผ์ชฝ ์์”์ผ๋ก ๊ฐ์ ํ ์ข์ธกโฏ๊ธฐ์ค ์ค๋ช ์ ๋๋ค.
์ผ์ด์ค | ์กฐ๊ฑด | ์ฒ๋ฆฌ ์์ฝ | ๊ฒฐ๊ณผ |
---|---|---|---|
I | S.color == RED |
1.โฏS → BLACK 2.โฏ P → RED 3.โฏ์ขํ์ (P) |
ํ์ ๋ฅผ BLACK์ผ๋ก ๋ง๋ ๋ค ์ผ์ด์คโฏII–IV๋ก ์งํ |
II | S.color == BLACK S.left.color == BLACK S.right.color == BLACK |
1.โฏS → RED 2.โฏ x ← P |
๋ฌธ์ ๋ฅผ ์๋ก ์ฌ๋ฆผ (x=x.p) x๊ฐ ๋ฃจํธ๊ฐ ์๋๋ฉด์ x๊ฐ BLACK์ผ ๊ฒฝ์ฐ ์ฒ์์ผ๋ก |
III | S.color == BLACK S.left.color == RED S.right.color == BLACK |
1.โฏS.left → BLACK 2.โฏ S → RED 3.โฏ์ฐํ์ (S) |
์ํ ํ ์ผ์ด์ค IV๋ก ์งํ |
IV | S.color == BLACK S.right.color == RED |
1.โฏS.color ← P.color 2.โฏ P → BLACK 3.โฏ S.right → BLACK4.โฏ์ขํ์ (P) 5.โฏ x ← root |
black-height (๊ท์น #5) ๋ณต๊ตฌ && ์์ฑ์ ๋ชจ๋ ๋ง์กฑ x๊ฐ ๋ฃจํธ๊ฐ ์๋๋ฉด์ x๊ฐ BLACK์ผ ๊ฒฝ์ฐ ์ฒ์์ผ๋ก |
๋์นญ์ผ๋ก x๊ฐ ์ค๋ฅธ์ชฝ ์์์ด๋ฉด LEFT/RIGHT, INNER/OUTER ๋ฐฉํฅ๋ง ๋ฐ๊พธ๋ฉด ๋ฉ๋๋ค.
4.5. ๋ ธ๋ ์ญ์ ์๋์ฝ๋
์ญ์ ๋ ์๋นํ ๋ณต์กํ์ฌ fixup๋ฟ๋ง ์๋๋ผ ๋ ธ๋ ์ญ์ ์ ์ฒด ์๊ณ ๋ฆฌ์ฆ๋ ๊ฐ์ด ์ฌ๋ ค๋๋ฆฝ๋๋ค.
function RB-DELETE-FIXUP(T, x):
while x ≠ T.root and x.color == BLACK
if x == x.parent.left
w ← x.parent.right
if w.color == RED
w.color ← BLACK
x.parent.color ← RED
LEFT-ROTATE(T, x.parent)
w ← x.parent.right
if w.left.color == BLACK and w.right.color == BLACK
w.color ← RED
x ← x.parent
else
if w.right.color == BLACK
w.left.color ← BLACK
w.color ← RED
RIGHT-ROTATE(T, w)
w ← x.parent.right
w.color ← x.parent.color
x.parent.color ← BLACK
w.right.color ← BLACK
LEFT-ROTATE(T, x.parent)
x ← T.root
else
... (์๊ธฐ ๊ณผ์ ์ ์ข์ฐ ๋์นญ) ...
x.color ← BLACK
function RB-DELETE(T, z):
y ← z
y_original_color ← y.color
if z.left == T.nil
x ← z.right
RB-TRANSPLANT(T, z, z.right)
else if z.right == T.nil
x ← z.left
RB-TRANSPLANT(T, z, z.left)
else
y ← TREE-MINIMUM(z.right)
y_original_color ← y.color
x ← y.right
if y.parent == z
x.parent ← y
else
RB-TRANSPLANT(T, y, y.right)
y.right ← z.right
y.right.parent ← y
RB-TRANSPLANT(T, z, y)
y.left ← z.left
y.left.parent ← y
y.color ← z.color
if y_original_color == BLACK
RB-DELETE-FIXUP(T, x)
5. ๋ ๋-๋ธ๋ ํธ๋ฆฌ์ ๊ฒ์
๊ฒ์์ ์ผ๋ฐ์ ์ธ BST์ ๋์ผํฉ๋๋ค. ํธ๋ฆฌ ์ํ๊ฐ ์ผ๋ ๊ทธ๋ ๋ฏ ๋ฐ๋ณต ๋ฒ์ ๊ณผ ์ฌ๊ท ๋ฒ์ ์ด ์์ต๋๋ค. ์๋ ์๋์ฝ๋๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์.
// ๋ฐ๋ณต
function RB-TREE-FIND-ITER(T, k):
x ← T.root
while x ≠ T.nil and k ≠ x.key:
if k < x.key:
x ← x.left
else:
x ← x.right
if x = T.nil:
return T.nil
else
return x
// ์ฌ๊ท
function RB-TREE-FIND-RECUR(x, k):
if x = T.nil or k = x.key:
return x
if k < x.key:
return RB-TREE-FIND-RECUR(x.left, k)
else:
return RB-TREE-FIND-RECUR(x.right, k)
// ์ฌ์ฉ ์์
function RB-TREE-FIND(T, k):
// return RB-TREE-FIND-ITER(T.root, k) // ๋ฐ๋ณต
return RB-TREE-FIND-RECUR(T.root, k) // ์ฌ๊ท
6. ๋ ๋-๋ธ๋ ํธ๋ฆฌ์ ๊ธฐํ ํน์ง
- ์ฝ์ , ์ญ์ , ๊ฒ์ ๋ชจ๋ ์ต์ ์ ๊ฒฝ์ฐ์๋ O(log n)์ ๋๋ค.
- ํธ๋ฆฌ์ ์ต๋ ๋์ด(h)๋ ํญ์ 2 * logโ(n+1) ์ดํ๋ก ์ ํ๋ฉ๋๋ค.
- RBT๋ 2-3-4 ํธ๋ฆฌ์ ์ด์ง ํธ๋ฆฌ ๊ตฌํ์ผ๋ก ๋ณผ ์ ์์ผ๋ฉฐ, B-Tree์ ํน์ํ ๊ฒฝ์ฐ๋ก ์ดํด๋ ์๋ ์์ต๋๋ค.
- AVL ํธ๋ฆฌ์ ๋นํด ๊ท ํ ๋ณต๊ตฌ์ ํ์ํ ํ์ ํ์๊ฐ ์ ๊ณ , ๋ ๋น ๋ฅธ ์ฐ์ฐ ์ํ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ์ค์ ๋ก ๋๋ฆฌ ์ฐ์ด๋ฉฐ, ํนํ C++์ std::map๊ณผ std::set, ์๋ฐ์ TreeMap์ด ๋ํ์ ์ธ ์์ ๋๋ค.
- ๋ฆฌ๋ ์ค ์ปค๋์ rbtree.c: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/lib/rbtree.c
7. ์ฐธ๊ณ ๋ฌธํ
Cormen, T. H., Leiserson, C. E., Rivest, R. L., & Stein, C. (2022). Introduction to algorithms (4th ed., p. 343-345). The MIT Press.
Woltmann, S. (n.d.). Red-Black Tree (Fully Explained + with Java Code). HappyCoders.eu. Retrieved April 19, 2025, from https://www.happycoders.eu/algorithms/red-black-tree-java/
๊น๋๋ฃจ. (n.d.). Red-Black Tree (4) ์ฝ์ (insert, insert_fix_up). Velog. Retrieved April 19, 2025, from https://velog.io/@stthunderl/Red-Black-Tree-4-%EC%82%BD%EC%9E%85insert