rbtree ํ†บ์•„๋ณด๊ธฐ๐Ÿ”ฅ

Hyeongjin Songยท2023๋…„ 11์›” 4์ผ

jungle

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

1. rbtree

๋‹ค์Œ์˜ 5๊ฐœ์˜ ์†์„ฑ์„ ๋ชจ๋‘ ๋งŒ์กฑํ•˜๋Š” ์ด์ง„ ํŠธ๋ฆฌ

2. ์‚ฝ์ž…

1. ์‚ฝ์ž…ํ•˜๋Š” ๋…ธ๋“œ ์ƒ‰์€ ํ•ญ์ƒ RED - 5๋ฒˆ ์†์„ฑ์„ ๋งŒ์กฑํ•˜๊ธฐ ์œ„ํ•ด

๋”ฐ๋ผ์„œ, ์•„๋ž˜์˜ ์ผ€์ด์Šค๋“ค๋กœ ๋ฌธ์ œ๊ฐ€ ๋‚˜๋ˆ ์ง€๊ฒŒ ๋œ๋‹ค. ์ฆ‰, ํŠธ๋ฆฌ๋ฅผ ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑํ•˜์—ฌ ์œ„์˜ 5๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋ชจ๋‘ ๋งŒ์กฑํ•˜๋„๋ก ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค!

2. CASES

  1. ์‚ฝ์ž…๋œ red ๋…ธ๋“œ๊ฐ€ ๋ถ€๋ชจ์˜ ์™ผ์ชฝ ์ž๋…€ && ๋ถ€๋ชจ๋Š” red๊ณ  ํ• ์•„๋ฒ„์ง€์˜ ์™ผ์ชฝ ์ž๋…€ && ๋ถ€๋ชจ์˜ ํ˜•์ œ๋Š” black : case 3


    -> ๋ถ€๋ชจ์™€ ํ• ์•„๋ฒ„์ง€์˜ ์ƒ‰์„ ๋ฐ”๊พผํ›„ ํ• ์•„๋ฒ„์ง€ ๊ธฐ์ค€ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํšŒ์ „
  1. ์‚ฝ์ž…๋œ red ๋…ธ๋“œ๊ฐ€ ๋ถ€๋ชจ์˜ ์˜ค๋ฅธ์ชฝ ์ž๋…€ && ๋ถ€๋ชจ๋Š” red๊ณ  ํ• ์•„๋ฒ„์ง€์˜ ์™ผ์ชฝ ์ž๋…€ && ๋ถ€๋ชจ์˜ ํ˜•์ œ๋Š” black : case 2


    -> ๋ถ€๋ชจ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ์œผ๋กœ ํšŒ์ „ํ•œ ๋’ค ์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํšŒ์ „. ์ฆ‰ case 3๋กœ ๋ฐ”๊พผ ๋’ค ํ•ด๊ฒฐ.
  1. ์‚ฝ์ž…๋œ red ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๊ฐ€ red && ๋ถ€๋ชจ์˜ ํ˜•์ œ๋„ red : case 1


    -> ๋ถ€๋ชจ์™€ ๋ถ€๋ชจ์˜ ํ˜•์ œ๋ฅผ black์œผ๋กœ ๋ฐ”๊พธ๊ณ  ํ• ์•„๋ฒ„์ง€๋ฅผ red๋กœ ๋ฐ”๊พผ ๋’ค ํ• ์•„๋ฒ„์ง€์—์„œ ๋‹ค์‹œ ํ™•์ธ ์‹œ์ž‘(๋์ด ์•„๋‹˜)

3. ์‚ญ์ œ

1. ์ด์ง„ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ ์‚ญ์ œ ๋ฐฉ์‹๊ณผ ๋™์ผ

๋‹จ, rbtree์—์„œ๋Š” ์–ด๋–ค ์ƒ‰์ด ์‚ญ์ œ๋˜๋Š”์ง€๊ฐ€ ์†์„ฑ ์œ„๋ฐ˜ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ๋•Œ ์ค‘์š”ํ•˜๋‹ค.

2. ์‚ญ์ œ๋˜๋Š” ์ƒ‰ ๊ฒฐ์ •

  1. ์‚ญ์ œํ•˜๋ ค๋Š” ๋…ธ๋“œ์˜ ์ž๋…€๊ฐ€ ์—†๊ฑฐ๋‚˜ ํ•˜๋‚˜์ผ ๋•Œ(nil node ์ œ์™ธ)

    -> ์‚ญ์ œ๋˜๋Š” ์ƒ‰ = ์‚ญ์ œ๋˜๋Š” ๋…ธ๋“œ์˜ ์ƒ‰
  1. ์‚ญ์ œํ•˜๋ ค๋Š” ๋…ธ๋“œ์˜ ์ž๋…€๊ฐ€ ๋‘˜์ผ ๋•Œ(nil node ์ œ์™ธ)

    -> ์‚ญ์ œ๋˜๋Š” ์ƒ‰ = ์‚ญ์ œ๋˜๋Š” ๋…ธ๋“œ์˜ successor์˜ ์ƒ‰

3. ์‚ญ์ œ๋˜๋Š” ์ƒ‰ ๊ฒฐ์ • ์ดํ›„

  1. ์‚ญ์ œ๋˜๋Š” ์ƒ‰์ด red

    -> ์–ด๋– ํ•œ ์†์„ฑ๋„ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š์Œ
  2. ์‚ญ์ œ๋˜๋Š” ์ƒ‰์ด black

    -> 2, 4, 5๋ฒˆ ์†์„ฑ์„ ์œ„๋ฐ˜ํ•  ์ˆ˜ ์žˆ์Œ. ๋”ฐ๋ผ์„œ ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Œ!

4. ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ ๊ณผ์ •

๋ถ€๋ชจ๋กœ ํƒ€๊ณ  ์˜ฌ๋ผ๊ฐ€๋ฉด์„œ ๋ธ”๋ž™์ด๋ฉด ๊ณ„์† while๋ฌธ์„ ๋ˆ๋‹ค.
๊ฒฐ๊ตญ doubly black์ด๋ž€๊ฑด ๋ถ€๋ชจ๊ฐ€ ๋ธ”๋ž™์ผ ๋•Œ๋ฅผ ๋งํ•˜๋Š” ๊ฒƒ!

while (ํƒ€๊ฒŸ์ด ๋ฃจํŠธ์•„๋‹˜ && ํƒ€๊ฒŸ == BLACK) {

    // CASE 1.
    if **ํ˜•์ œ == RED**
        ํ˜•์ œ/๋ถ€๋ชจ ์„œ๋กœ ์ƒ‰๋ฐ”๊พธ๊ธฐ, ๋ถ€๋ชจ๊ธฐ์ค€ ํšŒ์ „ (ํƒ€๊ฒŸ์ด ๋‚ด๋ ค๊ฐ€๋„๋ก)

    // CASE 2.
    if **ํ˜•์ œ == BLACK, ํ˜•์ œ์˜ ์ž์‹ ๋‘˜๋‹ค ๋ธ”๋ž™**
        ํ˜•์ œ/์ž์‹ ์˜ ๋ธ”๋ž™์„ ๋ถ€๋ชจ๋กœ ์˜ฌ๋ฆฌ๊ธฐ -> ํ˜•์ œ๋ฅผ RED๋กœ ๋ณ€๊ฒฝ, ๋ถ€๋ชจ์—์„œ ๋‹ค์‹œ fixup

    else {
        // CASE 3.
        if ํ˜•์ œ == BLACK, (**ํ˜•์ œ์˜ ๊บพ์ธ ์ž์‹**) == RED
            ์ž์‹ RED์™€ ํ˜•์ œ ์„œ๋กœ ์ƒ‰๋ฐ”๊พธ๊ธฐ, ํŽด์ง€๊ฒŒ ํšŒ์ „ (RED๊ฐ€ ๋ฐ”๊นฅ์ชฝ์— ์˜ค๊ฒŒ)
            CASE 4๊ฐ€ ๋จ

        // CASE 4. ํ˜•์ œ == BLACK, (**ํ˜•์ œ์˜ ํŽด์ง„ ์ž์‹**) == RED
        ๋ถ€๋ชจ/ํ˜•์ œ ์„œ๋กœ ์ƒ‰๋ฐ”๊พธ๊ธฐ
        ํ˜•์ œ์˜(ํŽด์ง„ ์ž์‹) = BLACK
        ๋ถ€๋ชจ๊ธฐ์ค€ ํšŒ์ „ (ํƒ€๊ฒŸ์ด ๋‚ด๋ ค๊ฐ€๋„๋ก)
        ํƒ€๊ฒŸ์„ ๋ฃจํŠธ๋กœ ์„ค์ • -> while ์ข…๋ฃŒ
    }
}

// ์ข…๋ฃŒ์ „
ํƒ€๊ฒŸ์„ BLACK์œผ๋กœ ๋ณ€๊ฒฝ
profile
first in, last out

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