ํŠธ๋ฆฌ 4 (AVL ํšŒ์ „)

8/28/2025

AVL ํŠธ๋ฆฌ๋Š” ์ด์ „ ์‹œ๊ฐ„์— ๋ดค๋˜๊ฒƒ ์ฒ˜๋Ÿผ ์ผ๋ฐ˜ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌBST์— 'ํšŒ์ „'์ด๋ผ๋Š” ๊ณผ์ •์„ ํ†ต
ํ•ด ์‚ฝ์ž…๊ณผ ์‚ญ์ œ ํ›„์— ๋†’์ด์˜ ์ฐจ์ด๋ฅผ k=1 ์ดํ•˜๊ฐ€ ๋˜๋„๋ก ์กฐ์ •ํ•˜๋Š” ์—ฐ์‚ฐ์ด ์ถ”๊ฐ€๋œ ํŠธ๋ฆฌ๋‹ค.

ํšŒ์ „

AVL ์กฐ๊ฑด์˜ ์œ„๋ฐฐ?
์‚ฝ์ž… ํ˜น์€ ์‚ญ์ œ ํ›„์— AVLํŠธ๋ฆฌ์˜ ์กฐ๊ฑด์ด ์œ„๋ฐฐ๋˜์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค๋Š”๊ฒƒ์€ k๊ฐ€ ์ •ํ™•ํžˆ 2๊ฐ€ ๋˜์—ˆ๋‹ค๋Š” ๋ง์ด๋‹ค.

์‚ฝ์ž… ์ดํ›„ ํšŒ์ „

์‚ฝ์ž… ์ดํ›„์— AVL ํŠธ๋ฆฌ์˜ ์†์„ฑ์„ ํšŒ๋ณตํ•˜๋ ค๋ฉด ์‚ฝ์ž… ์ง€์ ์—์„œ ์‹œ์ž‘ํ•ด ๋ฃจํŠธ๊นŒ์ง€ ์ด๋™ํ•˜๋ฉด์„œ AVL ์†์„ฑ์„ ๋งŒ์กฑ์‹œํ‚ค์ง€ ์•Š๋Š” ์ฒซ ๋ฒˆ์งธ ๋…ธ๋“œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ฐพ๋Š”๋‹ค.

์ด ๋…ธ๋“œ๋ฅผ X๋ผ๊ณ  ํ•˜์ž. ์ด ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ์ด ๋„ค ๊ฐ€์ง€๋‹ค.

  1. X์˜ ์™ผ์ชฝ ์ž์‹์˜ ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์— ๋…ธ๋“œ๊ฐ€ ์‚ฝ์ž…๋œ ๊ฒฝ์šฐ (LL)
  2. X์˜ ์™ผ์ชฝ ์ž์‹์˜ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์— ๋…ธ๋“œ๊ฐ€ ์‚ฝ์ž…๋œ ๊ฒฝ์šฐ (LR)
  3. X์˜ ์˜ค๋ฅธ์ชฝ ์ž์‹์˜ ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์— ๋…ธ๋“œ๊ฐ€ ์‚ฝ์ž…๋œ ๊ฒฝ์šฐ (RL)
  4. X์˜ ์˜ค๋ฅธ์ชฝ ์ž์‹์˜ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์— ๋…ธ๋“œ๊ฐ€ ์‚ฝ์ž…๋œ ๊ฒฝ์šฐ (RR)
    1๋ฒˆ๊ณผ 4๋ฒˆ์˜ ๊ฒฝ์šฐ์—๋Š” ํšŒ์ „ ํ•œ ๋ฒˆ์„ ํ†ตํ•ด ์™„๋ฃŒ๋˜์ง€๋งŒ, 2๋ฒˆ๊ณผ 3๋ฒˆ์˜ ๊ฒฝ์šฐ์—๋Š” ๋‘ ๋ฒˆ์˜ ํšŒ์ „์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

๋‹จ์ˆœ ํšŒ์ „

LL ํšŒ์ „

    9
  8
7

7์ด ๋ฐฉ๊ธ‰ ์‚ฝ์ž…๋œ ๋…ธ๋“œ๋ผ๋ฉด X๋…ธ๋“œ๋Š” ๋ฌด์—‡์ผ๊นŒ?
8์€ 1 - 0 = 1 ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ์—†๊ณ , 9๋Š” 2-0 = 2 ๋กœ k๊ฐ€ 1๋ณด๋‹ค ์ปค์ ธ์„œ 9๊ฐ€ ์ฒซ ๋…ธ๋“œ X๊ฐ€ ๋œ๋‹ค.
9 ๋…ธ๋“œ์—์„œ LL ํšŒ์ „์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  8
7   9

๊ทธ๋Ÿฐ๋ฐ ๊ฐ ๋…ธ๋“œ๋“ค์ด ์„œ๋ธŒํŠธ๋ฆฌ๋ฅด ๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ์—๋Š” ์–ด๋–กํ• ๊นŒ?

       9
    8      10
  7   8.5
6

์ด๋ ‡๊ฒŒ 8.5์™€ 10์ด ์žˆ์œผ๋ฉด?
8.5๋ฅผ 9์˜ ์™ผ์ชฝ์— ์œ„์น˜์‹œํ‚จ๋‹ค.
๊ตฌ์ฒด์ ์ธ ์ฝ”๋“œ๋Š” ์ด๋ ‡๋‹ค.

struct AVLTreeNode *SingleRotateRight(struct AVLTreeNode *x) {
	struct AVLTreeNode *w = x->left;
	
	x->left = w->right;
	w->right = x;
	
	x->height = max(height(x->left),height(x->right))+1;
	w->height = max(height(w->left),x->height)+1;
	
	return w;
}
  1. w->right๋Š” w๋ณด๋‹ค ํฌ๋ฉด์„œ x๋ณด๋‹ค ์ž‘๊ธฐ ๋•Œ๋ฌธ์— x->left๋กœ ์˜ค๋ฉด ๋˜๊ณ ,
  2. w->right๋ฅผ x๋กœ ๋ณ€๊ฒฝ. (x->right์™€ w->left๋Š” ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.)
  3. ๊ทธ๋ฆฌ๊ณ  x์™€ w์˜ ๋†’์ด๋ฅผ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.

RR ํšŒ์ „

LL๊ณผ ์œ ์‚ฌํ•œ๋ฐ ์ฐจ์ด์ ์ด๋ผ๋ฉด w๋Œ€์‹  y(x์˜ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ์•ŒํŒŒ๋ฒณ์ด๋ผ)์„ ์‚ฌ์šฉํ•˜๊ณ ,
x->left ๋Œ€์‹  x->right์™€ w->right๋Œ€์‹  y->left๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. (์ •ํ™•ํžˆ LL์ด ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ๋…ธ๋“œ๋ฅผ ๋ณ€๊ฒฝ)

struct AVLTreeNode *SingleRotateLeft(struct AVLTreeNode *x) {
	struct AVLTreeNode *y = x->right;
	
	x->right = y->left;
	y->left = x;
	
	x->height = max(height(x->left),height(x->right))+1;
	y->height = max(height(y->right),x->height)+1;
	
	return y;
}

๋‹จ์ˆœ ํšŒ์ „single rotation์˜ ๊ฒฝ์šฐ์—๋Š” LL์ด๋‚˜ RR ๋ชจ๋‘ ์‹ค์ œ๋กœ ์ค‘์š”ํ•˜๊ฒŒ ๋‹ค๋ค„์ง€๋Š” ์„œ๋ธŒํŠธ๋ฆฌ๋Š” LL์˜ ๊ฒฝ์šฐ LR(w->right) ์ชฝ ํŠธ๋ฆฌ์ด๊ณ  RR์˜ ๊ฒฝ์šฐ RL(y->left) ์ชฝ ํŠธ๋ฆฌ๋‹ค. ๊ฐ ์„œ๋ธŒํŠธ๋ฆฌ๋“ค์„ ๊ธฐ์กด ๋ฃจํŠธ x์— ๋ถ™์—ฌ์ค€๋‹ค.

์ด์ค‘ ํšŒ์ „

์ด์ค‘ ํšŒ์ „์€ RLํŠธ๋ฆฌ์™€ LR ํŠธ๋ฆฌ์— ์‚ฝ์ž…์ด ๋ฐœ์ƒํ•œ ํ›„์— AVL ์กฐ๊ฑด์„ ์œ„๋ฐฐํ•˜๊ฒŒ ๋  ๋•Œ ์‹คํ–‰๋œ๋‹ค.
'์ด์ค‘double'์ด๋ผ๋Š” ๋ง์ฒ˜๋Ÿผ ๋‹จ์ผ ํšŒ์ „์„ ๋‘ ๋ฒˆ ๋ฐ˜๋ณตํ•˜๋ฉด ๋˜๋Š”๋ฐ LL์˜ ๊ฒฝ์šฐ๋Š” RRํšŒ์ „ ํ›„์— LLํšŒ์ „, RL์˜ ๊ฒฝ์šฐ์—๋Š” LLํšŒ์ „ ํ›„์— RR ํšŒ์ „.

// LR
struct AVLTreeNode *DoubleRotationLeft(struct AVLTreeNode *x){
	x->left = SingleRotateLeft(x->left);
	return SingleRotateRight(x);
}

// RL
struct AVLTreeNode *DoubleRotationLeft(struct AVLTreeNode *x){
	x->right = SingleRotateRight(x->right);
	return SingleRotateLeft(x);
}