IT/์ปดํ“จํŒ…์  ์‚ฌ๊ณ 

๋ ˆ๋“œ-๋ธ”๋ž™ ํŠธ๋ฆฌ (Red-Black Tree)

Unused 2025. 4. 18. 11:13

์•„์‰ฝ๊ฒŒ๋„ ์ด 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๊ฐœ์กฐ

RBT์˜ ์˜ˆ์‹œ. Credit: https://www.happycoders.eu/algorithms/red-black-tree-java/

๋ ˆ๋“œ-๋ธ”๋ž™ ํŠธ๋ฆฌ๋Š” ์•„๋ž˜ 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 ์œ„๋ฐ˜์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. P์™€ U๋ฅผ BLACK์œผ๋กœ ๋ณ€๊ฒฝ
  2. G๋ฅผ RED๋กœ ๋ณ€๊ฒฝ
  3. ํ˜„์žฌ ํƒ์ƒ‰ ์ค‘์ธ ๋…ธ๋“œ๋ฅผ ๊ทธ์˜ ์กฐ๋ถ€๋ชจ๋กœ ๋ฐ”๊พผ ๋’ค, ๋ฐ˜๋ณต๋ฌธ์˜ ์ฒ˜์Œ์œผ๋กœ

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

ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ์ด ์‚ผ๊ฐํ˜• ๊ตฌ์กฐ๋ฅผ ์ผ์ž ํ˜•ํƒœ๋กœ ํ…๋‹ˆ๋‹ค. ์ „์ฒด ๊ณผ์ •์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ํšŒ์ „: '์™ผ์ชฝ-์‚ผ๊ฐํ˜• (G → P ์™ผ์ชฝ → N ์˜ค๋ฅธ์ชฝ)'์ด๋ฉด, ๋ถ€๋ชจ P๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ ํšŒ์ „(leftRotate(P)). '์˜ค๋ฅธ์ชฝ-์‚ผ๊ฐํ˜• (G → P ์˜ค๋ฅธ์ชฝ → N ์™ผ์ชฝ)'์ด๋ฉด, ๋ถ€๋ชจ P๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฅธ์ชฝ ํšŒ์ „(rightRotate(P)).
  2. ์ƒˆ๋กœ์šด N ์ง€์ • (ํšŒ์ „ ํ›„ N ← P๋กœ ์žฌ์ง€์ •)
  3. ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ด๋™ (์ผ์ž ํ˜•ํƒœ๊ฐ€ ๋˜์—ˆ์œผ๋ฏ€๋กœ, ์ผ์ž ํ˜•ํƒœ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ผ€์ด์Šค 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 ์œ„๋ฐ˜์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์กฐ์ƒ์œผ๋กœ ์ „ํŒŒ๋œ ๊ฒƒ์ด ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฐ˜๋ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. G์™€ P์˜ ์ƒ‰์„ ๋งž๋ฐ”๊ฟˆ
  2. Left-left ๊ตฌ์กฐ์ผ ์‹œ G๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฅธ์ชฝ ํšŒ์ „(rightRotate(G)). ๋‹จ, right-right ๊ตฌ์กฐ๋ผ๋ฉด G๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ ํšŒ์ „
  3. 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. ์ž ๊น, ์™ผ์ชฝ/์˜ค๋ฅธ์ชฝ ํšŒ์ „์ด๋ž€?

Credit: https://simpletechtalks.com/

ํŠธ๋ฆฌ ํšŒ์ „์€ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ(BST)์˜ ๊ตฌ์กฐ๋ฅผ ์žฌ์กฐ์ •ํ•˜๋ฉด์„œ BST์˜ ํŠน์ง•(์™ผ์ชฝ ์ž์‹ ≤ ๋ถ€๋ชจ ≤ ์˜ค๋ฅธ์ชฝ ์ž์‹) ์„ ์œ ์ง€ํ•˜๋Š” ์—ฐ์‚ฐ์ž…๋‹ˆ๋‹ค. ๋ ˆ๋“œ-๋ธ”๋ž™ ํŠธ๋ฆฌ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ AVL ํŠธ๋ฆฌ ๋“ฑ self-balancing BST (๊ท ํ˜•์„ ์Šค์Šค๋กœ ๋˜์ฐพ๋Š” BST)์—์„œ ๋†’์ด ๊ท ํ˜•์„ ๋งž์ถ”๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ BST์—์„œ๋Š”, ์‚ฝ์ž…/์‚ญ์ œ ํ›„, BST ์†์„ฑ์— ์–ด๊ธ‹๋‚˜๊ฒŒ ๋  ๊ฒฝ์šฐ ํšŒ์ „์„ ์‹œํ‚ต๋‹ˆ๋‹ค (๋ถ€๋ชจ > ์˜ค๋ฅธ์ชฝ ์ž์‹, ๋ถ€๋ชจ < ์™ผ์ชฝ ์ž์‹ ๋“ฑ). ํ•œํŽธ ๋ ˆ๋“œ-๋ธ”๋ž™ ํŠธ๋ฆฌ์˜ ์‚ฝ์ž…์˜ ๊ฒฝ์šฐ ์ƒ๊ธฐ ๋ฐ˜๋ณต ์ผ€์ด์Šค I, II, III๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •์—์„œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ˆ˜ํ–‰์‹œํ‚ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

3.4.1. ์™ผ์ชฝ ํšŒ์ „

์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ๊ฐ€ ๋ฌด๊ฑฐ์šธ ๋•Œ, ๊ท ํ˜•์„ ๋งž์ถ”๊ธฐ ์œ„ํ•ด ์™ผ์ชฝ์œผ๋กœ ๊บพ์Šต๋‹ˆ๋‹ค.

Credit: https://www.happycoders.eu/algorithms/red-black-tree-java/
์•ˆ๋‚ด: ์• ํ”Œ ๊ตฌํ˜•๊ธฐ๊ธฐ์—์„œ๋Š” ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. R ← N.right
  2. N.right ← R.left
  3. R.parent ← N.parent (R๊ฐ€ ๋ฃจํŠธ๊ฐ€ ๋˜๊ฑฐ๋‚˜, ๋ถ€๋ชจ์˜ ์ž์‹ ํฌ์ธํ„ฐ๋ฅผ ์ˆ˜์ •)
  4. R.left ← N
  5. 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)

์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ๊ฐ€ ๋ฌด๊ฑฐ์šธ ๋•Œ, ๊ท ํ˜•์„ ๋งž์ถ”๊ธฐ ์œ„ํ•ด ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊บพ์Šต๋‹ˆ๋‹ค.

Credit: https://www.happycoders.eu/algorithms/red-black-tree-java/
์•ˆ๋‚ด: ์• ํ”Œ ๊ตฌํ˜•๊ธฐ๊ธฐ์—์„œ๋Š” ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. L ← N.left
  2. N.left ← L.right
  3. L.parent ← N.parent (L๊ฐ€ ๋ฃจํŠธ๊ฐ€ ๋˜๊ฑฐ๋‚˜, ๋ถ€๋ชจ์˜ ์ž์‹ ํฌ์ธํ„ฐ๋ฅผ ์ˆ˜์ •)
  4. L.right ← N
  5. 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์˜ ์‚ญ์ œ ๊ณผ์ • ์ž์ฒด๋งŒ์œผ๋กœ๋„ ๋ณต์žกํ•˜๋ฏ€๋กœ, ๋จผ์ € BST์˜ ์‚ญ์ œ ๊ณผ์ •์„ ๊ผญ ์ฝ๊ณ  ์™€์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์‚ฝ์ž…์„ ํ–ˆ์œผ๋‹ˆ ์ด์ œ ์‚ญ์ œ๋ฅผ ํ•ด์•ผ๊ฒ ์ง€์š”? ์‚ญ์ œ ์—ญ์‹œ ์ผ๋ฐ˜์ ์ธ 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. ์‚ญ์ œ ์ ˆ์ฐจ์˜ ํ๋ฆ„

  1. ์ผ๋ฐ˜์ ์ธ 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๋ฉด ์—ฌ๊ธฐ์„œ ์ข…๋ฃŒ
  2. 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 → BLACK
4.โ€ฏ์ขŒํšŒ์ „(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