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 ;
}
๐์ ๋ฆฌ
- ํ์ ์ด ์ผ์ด๋๋ ์ด์งํ์ ํธ๋ฆฌ์ ํน์ฑ์ ์ ์งํ๋ค
- ๋ ธ๋์ ์ถ๊ฐ/์ญ์ ๊ณผ์ ์์, ๋ ๋-๋ธ๋ ํธ๋ฆฌ์ ํน์ฑ์ ์ ์งํ๊ธฐ ์ํด ํธ๋ฆฌ์ ๊ตฌ์กฐ๋ฅผ ์์ ํด์ผํ๋ค.
- ํ์ง๋ง, ์ด์ง ํ์ํธ๋ฆฌ์ ํน์ฑ ๋ํ ์ ์ง๋์ด์ผ ํ๋๋ฐ, ํ์ ์ ์ด์ฉํ๋ฉด ์ด์งํ์ ํธ๋ฆฌ์ ํน์ฑ์ ์ ์งํ๋ฉด์ ํธ๋ฆฌ์ ๊ตฌ์กฐ๋ฅผ ์์ ํ ์ ์๋ค.