์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

[Red-Black ํŠธ๋ฆฌ]ํšŒ์ „ rotation

์žฅ์˜ 2023. 9. 5. 12:45

rotation


๐Ÿ“Œ๋ ˆ๋“œ๋ธ”๋ž™ ํŠธ๋ฆฌ์˜ ๋‹ค์„ฏ๊ฐ€์ง€ ์†์„ฑ

1.๋ชจ๋“  ๋…ธ๋“œ๋Š” red ํ˜น์€ black
2.๋ฃจํŠธ ๋…ธ๋“œ๋Š” black
3.๋ชจ๋“  nil๋…ธ๋“œ๋Š” black
4.red์˜ ์ž๋…€๋“ค์€ ๋ฐ˜๋“œ์‹œ black == red๊ฐ€ ์—ฐ์†์ ์œผ๋กœ ์กด์žฌํ•  ์ˆ˜ ์—†๋‹ค.
5.์ž„์˜์˜ ๋…ธ๋“œ์—์„œ ์ž์† nii ๋…ธ๋“œ๋“ค๊นŒ์ง€ ๊ฐ€๋Š” ๊ฒฝ๋กœ๋“ค์˜ black ์ˆ˜๋Š” ๊ฐ™๋‹ค (์ž๊ธฐ ์ž์‹ ์€ ์นด์šดํŠธ์—์„œ ์ œ์™ธ)

 

๐Ÿ“ŒํšŒ์ „(rotaion)

  • ๋ ˆ๋“œ-๋ธ”๋ž™ ํŠธ๋ฆฌ์˜ ์‚ฝ์ž…(insert), ์‚ญ์ œ(delete) ์—ฐ์‚ฐ ๊ณผ์ •์—์„œ ํŠธ๋ฆฌ๊ฐ€ ์ˆ˜์ •๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ ˆ๋“œ-๋ธ”๋ž™ ํŠธ๋ฆฌ์˜ ํŠน์„ฑ์„ ์œ„๋ฐ˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ํŠน์„ฑ์„ ๋ณต๊ตฌํ•ด์ฃผ๊ธฐ ์œ„ํ•ด์„œ ํŠธ๋ฆฌ๋‚ด์˜ ์ผ๋ถ€ ๋…ธ๋“œ๋“ค์˜ ์ƒ‰๊น”๊ณผ ํฌ์ธํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.
  • ํฌ์ธํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ํšŒ์ „์„ ์‚ฌ์šฉํ•˜๊ณ , ์ด๊ฒƒ์œผ๋กœ ์ด์ง„ ๊ฒ€์ƒ‰ํŠธ๋ฆฌ ํŠน์„ฑ์„ ๋ณด์ „ํ•œ๋‹ค.
 โœ๏ธ์‚ฝ์ž…/์‚ญ์ œ ๊ณผ์ •์—์„œ ๋…ธ๋“œ์˜ ์ถ”๊ฐ€/์‚ญ์ œ ๊ณผ์ •์ด ์ผ์–ด๋‚œ๋‹ค. ๋‹จ์ˆœ ์ด์ง„ ๊ฒ€์ƒ‰ํŠธ๋ฆฌ๋Š” ํ‚ค๊ฐ’์˜ ๋น„๊ต๋ฅผ ํ†ตํ•ด ๋‹จ์ˆœํžˆ ํ•ด๋‹น ์œ„์น˜์—์„œ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€/์‚ญ์ œ ํ•˜๋ฉด๋˜์ง€๋งŒ, ๋ ˆ๋“œ-๋ธ”๋ž™ ํŠธ๋ฆฌ๋Š” ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์˜ ํŠน์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ ˆ๋“œ-๋ธ”๋ž™ ํŠธ๋ฆฌ์˜ ํŠน์„ฑ์— ๋งž๋„๋ก ์ ์ ˆํžˆ ๋…ธ๋“œ์˜ ์ƒ‰๊น”๊ณผ ์œ„์น˜๋ฅผ ๋ฐ”๊พธ๋Š” ๊ณผ์ •์ดํ•„์š”ํ•˜๋‹ค. ์ด ๊ณผ์ •์—์„œ, ํšŒ์ „์„ ํ†ตํ•ด ์ด์ง„ ๊ฒ€์ƒ‰ํŠธ๋ฆฌ์˜ ํŠน์„ฑ์„ ๋ณด์ „ํ•˜๋ฉด์„œ ํŠธ๋ฆฌ์˜ ๊ตฌ์กฐ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Œ๊ณผ์ •

  • ํšŒ์ „์€ ์ด์ง„๊ฒ€์ƒ‰ํŠธ๋ฆฌ์˜ ํŠน์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ํŠธ๋ฆฌ์˜ ๊ตฌ์กฐ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค. ์ขŒํšŒ์ „์ด ์ผ์–ด๋‚œ ํ›„์—๋„ ์ด์ง„ ๊ฒ€์ƒ‰ํŠธ๋ฆฌ์˜ ํŠน์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
  • ์ขŒํšŒ์ „ ์ „ (์ค‘์œ„์ˆœํšŒ - ์˜ค๋ฆ„์ฐจ์ˆœ)
    • ๐›ผ - x - β - y - ๐›พ
  • ์ขŒํšŒ์ „ ํ›„(์ค‘์œ„์ˆœํšŒ - ์˜ค๋ฆ„์ฐจ์ˆœ)
    • ๐›ผ - x - β - y - ๐›พ

๐Ÿ“Œ๊ฐ€์ •

  • x์˜ ์˜ค๋ฅธ์ชฝ ์ž์‹์ด ๋ฆฌํ”„๋…ธ๋“œ๊ฐ€ ์•„๋‹˜.(x->right ! = T->nil)

๐Ÿ“Œ๋กœํ…Œ์ด์…˜ ์˜์‚ฌ ์ฝ”๋“œ

๐Ÿ“Œ์„ค๋ช…

๐Ÿ“Œ์ฝ”๋“œ

void left_rotation(rbtree *t, node_t *x) {
    node_t* y;
    y = x -> right;
    x->right = y ->left; 
    if (y->left != t->nil)
    {
        y->left->parent =x;
    }
    y->parent = x->parent; 
    if (x->parent == t->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;
    return ;
}

๐Ÿ“Œ์ •๋ฆฌ

  • ํšŒ์ „์ด ์ผ์–ด๋‚˜๋„ ์ด์ง„ํƒ์ƒ‰ ํŠธ๋ฆฌ์˜ ํŠน์„ฑ์„ ์œ ์ง€ํ•œ๋‹ค
  • ๋…ธ๋“œ์˜ ์ถ”๊ฐ€/์‚ญ์ œ ๊ณผ์ •์—์„œ, ๋ ˆ๋“œ-๋ธ”๋ž™ ํŠธ๋ฆฌ์˜ ํŠน์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํŠธ๋ฆฌ์˜ ๊ตฌ์กฐ๋ฅผ ์ˆ˜์ •ํ•ด์•ผํ•œ๋‹ค.
  • ํ•˜์ง€๋งŒ, ์ด์ง„ ํƒ์ƒ‰ํŠธ๋ฆฌ์˜ ํŠน์„ฑ ๋˜ํ•œ ์œ ์ง€๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ, ํšŒ์ „์„ ์ด์šฉํ•˜๋ฉด ์ด์ง„ํƒ์ƒ‰ ํŠธ๋ฆฌ์˜ ํŠน์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ํŠธ๋ฆฌ์˜ ๊ตฌ์กฐ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.