๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ’ป Computer Science/- Data Structure, Algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜-์ด๋ก ] ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ(Binary Search Tree)

by Wonit 2019. 11. 23.

์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ(Binary Search Tree)

์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•˜๊ธฐ ์ „์— ํŠธ๋ฆฌ์— ๋Œ€ํ•ด์„œ ๋จผ์ € ์•Œ๊ณ  ๋„˜์–ด๊ฐ€์ž

##ํŠธ๋ฆฌ(Binary Search Tree)๋ž€?

ํŠธ๋ฆฌ๋ž€ ์ž๋ฃŒ๋“ค์ด List, Stack, Queue์™€ ๊ฐ™์€ 1:1 ๊ด€๊ณ„์˜ ์„ ํ˜• ๊ตฌ์กฐ๊ฐ€ ์•„๋‹Œ 1:n ๊ด€๊ณ„์˜ ๋น„์„ ํ˜• ๊ตฌ์กฐ๋กœ ๊ณ„์ธต ๊ด€๊ณ„๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ณ„์ธตํ˜• ์ž๋ฃŒ๊ตฌ์กฐ๋ผ๊ณ  ํ•œ๋‹ค.

์ผ๋ฐ˜์ ์ธ ํŠธ๋ฆฌ


์œ„์˜ ๊ทธ๋ฆผ์—์„œ ์ˆซ์ž๋“ค์€ ์•„๋ž˜์˜ ์ˆซ์ž๋“ค์„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ด€๊ณ„๋ฅผ ๊ฐ–๊ณ  ์ด๋ฅผ ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„๋ผ๊ณ  ํ•œ๋‹ค.

ํ˜•์ œ ๊ด€๊ณ„๋ž€?

30์€ ์•„๋ž˜๋กœ(๊ณ„์ธต์ ์œผ๋กœ) 20๊ณผ 40์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋ฉด ๋ถ€๋ชจ๋Š” 30์ด ๋˜๊ณ  ์ž์‹์€ ๊ฐ๊ฐ 20๊ณผ40์ด ๋˜๋ฉฐ ์ด ๋‘˜์€ ์„œ๋กœ ํ˜•์ œ๊ด€๊ณ„ ๋ผ๊ณ ํ•œ๋‹ค.

๋…ธ๋“œ๋ž€?

์ด ๋•Œ 30์€ ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ๋˜๊ณ  20๊ณผ 40์€ ๊ฐ๊ฐ์˜ ์ž์‹ ๋…ธ๋“œ๋ผ๊ณ  ๋ถˆ๋ฆฐ๋‹ค. ์ด๋ฅผ ๋ฏธ๋ฃจ์–ด ๋ณด์•˜์„ ๋•Œ ๋…ธ๋“œ๋Š” ๊ฐ๊ฐ์˜ ์›์†Œ๋ฅผ ์ผ์ปซ๋Š” ๋ง์ด๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ ์ด๋Š” ์„ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋Š”๋ฐ ์ด ์„ ์„ ๋ฐ”๋กœ ๊ฐ„์„ ์ด๋ผ๊ณ  ํ•œ๋‹ค.

์„œ๋ธŒ ํŠธ๋ฆฌ๋ž€?

์ž์‹๋“ค์€ ๊ฐ๊ฐ ๋…๋ฆฝํ•˜์—ฌ ์ƒˆ๋กœ์šด ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฐ ๋…ธ๋“œ๋Š” ์ž์‹์˜ ๋…ธ๋“œ๋งŒํผ ์„œ๋ธŒ ํŠธ๋ฆฌ๋ฅผ ๊ฐ–๋Š”๋‹ค. 30์˜ ์„œ๋ธŒํŠธ๋ฆฌ๋Š” ์ž์‹๋…ธ๋“œ์˜ ์ˆ˜์™€ ๊ฐ™์œผ๋ฏ€๋กœ 2๊ฐ€ ๋œ๋‹ค.

์ฐจ์ˆ˜๋ž€?

์ฐจ์ˆ˜๋ž€ ํ•œ ๋…ธ๋“œ๊ฐ€ ๊ฐ€์ง€๋Š” ์„œ๋ธŒํŠธ๋ฆฌ์˜ ์ˆ˜, ์ฆ‰ ์ž์‹ ๋…ธ๋“œ์˜ ์ˆ˜์ด๋‹ค.

๋‹จ๋ง ๋…ธ๋“œ, ๋ฆฌํ”„ ๋…ธ๋“œ, Reaf Node๋ž€?

์ฐจ์ˆ˜๊ฐ€ 0์ธ ๋…ธ๋“œ, ์ฆ‰ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๋…ธ๋“œ๋ฅผ ๋‹จ๋ง ๋…ธ๋“œ ๋˜๋Š” ๋ฆฌํ”„ ๋…ธ๋“œ๋ผ๊ณ  ํ•œ๋‹ค.

ํ‚ค(Key)๋ž€?

Index ์— ํ•ด๋‹นํ•˜๋Š” ์‹ค์กดํ•˜๋Š” ๊ฐ’(Value)๋ฅผ ๋œปํ•˜๋ฉฐ ๋ฐฐ์—ด์—์„œ์˜ Arr[0] = 12, Arr[2] = 10 ์—์„œ 12์™€ 10์€ ํ‚ค๊ฐ’์ด ๋œ๋‹ค.

##์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ(Binary Search Tree)๋ž€?

์ขŒ์šฐ๊ฐ€ ๊ตฌ๋ถ„๋œ ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ, ํ˜น์€ ๋‘˜ ๋งŒ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ–๋Š”(์ฐจ์ˆ˜๊ฐ€ 2์ธ) ํŠธ๋ฆฌ๋ฅผ ๋œปํ•œ๋‹ค. ์ด์ง„ ํŠธ๋ฆฌ๊ฐ€ ๋˜๊ธฐ ์œ„ํ•œ ์กฐ๊ฑด์ด ์žˆ๋Š”๋ฐ
  • ์กฐ๊ฑด 1 : ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์˜ ๊ฐ ๋…ธ๋“œ๋Š” ํ‚ค๊ฐ’์„ ํ•˜๋‚˜์”ฉ ๊ฐ–๋Š”๋‹ค. ๊ฐ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’์€ ๋ชจ๋‘ ๋‹ฌ๋ผ์•ผ ํ•œ๋‹ค.

  • ์กฐ๊ฑด 2 : ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ์— ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ์ž‡๊ณ , ๊ฐ ๋…ธ๋“œ๋Š” ์ตœ๋Œ€ ๋‘ ๊ฐœ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ–๋Š”๋‹ค.

  • ์กฐ๊ฑด 3 : ์ž„์˜์˜ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’์€ ์ž์‹ ์˜ ์™ผ์ชฝ์— ์žˆ๋Š” ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’๋ณด๋‹ค ํฌ๊ณ , ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’๋ณด๋‹ค ์ž‘๋‹ค.

์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์—์„œ์˜ ๊ฒ€์ƒ‰

์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์—์„œ ํ‚ค๊ฐ€ [x]์ธ ๋…ธ๋“œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ ์ž ํ•œ๋‹ค. ํŠธ๋ฆฌ์— ํ‚ค๊ฐ€ x์ธ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜๋ฉด ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ๋ฆฌํ„ดํ•˜๊ณ , ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด(์‹คํŒจํ•˜๋Š” ๊ฒ€์ƒ‰) NIL์„ ๋ฆฌํ„ดํ•œ๋‹ค.

pseudo code
treeSearch(t, x){ // ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ ๋…ธ๋“œ t์˜ ํ‚ค ๊ฐ’, ๊ฒ€์ƒ‰ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’ x
    if(t=NIL or key[t] = x) then return t;            // ๋ฃจํŠธ๋…ธ๋“œ์˜ ๊ฐ’๊ณผ x์˜ ๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด ๋ฃจํŠธ๋…ธ๋“œ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.
    if(x<key[t]) then return treeSearch(left[t], x);            // x๊ฐ€ ํ‚ค ๊ฐ’๋ณด๋‹ค ์ž‘์œผ๋ฉด left[t]๋ฅผ ์žฌ๊ท€ํ˜ธ์ถœ ํ•œ๋‹ค.
    else return treeSearch(right[t], x);            // x๊ฐ€ ํ‚ค ๊ฐ’๋ณด๋‹ค ํฌ๋ฉด right[t]๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœํ•œ๋‹ค.
}

์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ ์˜ˆ์ œ

์•„๊นŒ ๋ดค๋˜ ๊ทธ๋ฆผ์„ ๋‹ค์‹œ ์˜ˆ๋กœ์จ ์‚ฌ์šฉํ•ด์„œ ํ๋ฆ„์ ์œผ๋กœ ๋ณด์ž. ํ‚ค ๊ฐ’ x=35๋ผ๊ณ  ํ–ˆ์„ ๋•Œ.

1 : ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ ๋ฃจํŠธ ๋…ธ๋“œ์˜ ๊ฐ’(30)๊ณผ ๊ฒ€์ƒ‰ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’(35)์ด ๊ฐ™์œผ๋ฉด t๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค๋ฅด๋ฏ€๋กœ if์กฐ๊ฑด๋ฌธ์— ๋ถ„๊ธฐ๋˜์ง€ ์•Š๋Š”๋‹ค.

2 : ๋ฃจํŠธ ๋…ธ๋“œ์˜ ๊ฐ’๋ณด๋‹ค ํ‚ค์˜ ๊ฐ’์ด ์ž‘์œผ๋ฉด ์žฌ๊ท€ํ˜ธ์ถœ๋กœ searchTree๋ฅผ ์žฌ๊ท€ํ•œ๋‹ค. -> ๋ฃจํŠธ ๋…ธ๋“œ์˜ ๊ฐ’(30)๋ณด๋‹ค x๊ฐ’์ด ํฌ๋ฏ€๋กœ searchTree(40, 35)์„ ์žฌ๊ท€ํ˜ธ์ถœ ํ•œ๋‹ค.

3 : ๋ฃจํŠธ ๋…ธ๋“œ์˜ ๊ฐ’(40)๊ณผ x ๊ฐ’(35)๋ฅผ ๋น„๊ตํ–ˆ์„ ๋•Œ ๋ฃจํŠธ ๋…ธ๋“œ์˜ ๊ฐ’์ด ๋” ํฌ๋ฏ€๋กœ right[t]์— ๋Œ€ํ•œ ์žฌ๊ท€ํ˜ธ์ถœ์„ ์‹คํ–‰ํ•œ๋‹ค.

4 : ๋ฃจํŠธ ๋…ธ๋“œ์˜ ๊ฐ’(35)์™€ x ๊ฐ’์ด ๊ฐ™์œผ๋ฏ€๋กœ ๋ฃจํŠธ๋…ธ๋“œ์˜ ๊ฐ’์„ return ํ•œ๋‹ค.

์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์—์„œ์˜ ์‚ฝ์ž…

์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์—์„œ ์‚ฝ์ž…์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์‚ฝ์ž…์„ ์›ํ•˜๋Š” ์ˆ˜ x๊ฐ€ ์—†์–ด์•ผํ•˜๊ณ  ๊ฒ€์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฑฐ์นœ ํ›„์— ์‚ฝ์ž…์ด ์ด๋ฃจ์–ด์ง„๋‹ค.

 

์šฐ์„  ์›์†Œ x๋ฅผ ์‚ฝ์ž…ํ•  ์ž๋ฆฌ์— x์— ๋Œ€ํ•œ ๊ฒ€์ƒ‰์„ ์‹ค์‹œํ•œ ์ˆ˜ ๋ฆฌํ”„ ๋…ธ๋“œ๋กœ ๋‹ค๋‹ค๋ผ์„œ ๋” ์ด์ƒ ๋‚ด๋ ค๊ฐˆ ๊ณณ์ด ์—†๋‹ค๋ฉด x๋Š” ๋ฆฌํ”„๋…ธ๋“œ์— ์ž์‹์œผ๋กœ ์ถ”๊ฐ€์‹œํ‚จ๋‹ค.

pseudo code
treeInsert(t, x){
    if(t=NIL) then{ // x์— ํ•ด๋‹นํ•˜๋Š” ๋…ธ๋“œ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ
        key[r] <- x; // x์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์„ ํ‚ค์— ๋„ฃ๊ณ 
        left[r] <- NIL; // ์™ผ์ชฝ ์˜ค๋ฅธ์ชฝ ์€ NIL์ธ ์ฑ„๋กœ ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ ๋‹ค
        right[r] <- NIL;
        return r; // ์ƒˆ ๋…ธ๋“œ r์„ ๋ฆฌํ„ดํ•œ๋‹ค.
    }
    if(x<key[t]){ // ํ‚ค ๊ฐ’๋ณด๋‹ค x๊ฐ€ ์ž‘์œผ๋ฉด
        then {left[t] <- treeInsert(left[t], x); return t;} // ์™ผ์ชฝ ๋…ธ๋“œ์— ์žฌ๊ท€์  ํ˜ธ์ถœ๋กœ treeInsert๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    }
    else {right[t] <- treeInsert(right[t], x); return t;} // ํ‚ค ๊ฐ’์ด x๋ณด๋‹ค ํฌ๋ฉด ์˜ค๋ฅธ์ชฝ ๋…ธ๋“œ์— ์žฌ๊ท€์  ํ˜ธ์ถœ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
}

์ด์ „ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ ์‚ฝ์ž… ๊ณผ์ •

30, 20, 25, 40, 10, 35๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์‚ฝ์ž…ํ•œ๋‹ค๊ณ  ํ•  ๋•Œ.

(a) : ์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” ์ƒํƒœ์—์„œ 30์ด ์‚ฝ์ž…๋˜๋ฉด 30ํ•˜๋‚˜๋งŒ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ํŠธ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
(b) : 20๊ณผ 30์„ ๋น„๊ตํ–ˆ์„ ๋•Œ 20์ด ๋” ์ž‘์œผ๋ฏ€๋กœ 30 ์™ผ์ชฝ์— ์ถ”๊ฐ€์‹œํ‚จ๋‹ค.
(c) : 25๊ฐ€ ์ž…๋ ฅ๋˜๋ฉด 30๋ณด๋‹ค ์ž‘์œผ๋ฏ€๋กœ ์™ผ์ชฝ์œผ๋กœ ๊ฐ€์„œ 20๊ณผ ๋น„๊ตํ•œ ํ›„ 20๋ณด๋‹ค ํฌ๋ฏ€๋กœ 20 ์˜ค๋ฅธ์ชฝ์— 25๋ฅผ ์ถ”๊ฐ€์‹œํ‚จ๋‹ค.
(d) : 40์ด ์ž…๋ ฅ๋˜๋ฉด 30๋ณด๋‹ค ํฌ๋ฏ€๋กœ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐ€์„œ 30๊ณผ ๋น„๊ตํ•œ ํ›„ 30๋ณด๋‹ค ํฌ๋ฏ€๋กœ 30 ์˜ค๋ฅธ์ชฝ์— 40์„ ์ถ”๊ฐ€์‹œํ‚จ๋‹ค.
(e) : 10์ด ์ž…๋ ฅ๋˜๋ฉด 30๋ณด๋‹ค ์ž‘์œผ๋ฏ€๋กœ ์™ผ์ชฝ์œผ๋กœ ๊ฐ€์„œ 20๊ณผ ๋น„๊ตํ•œ ํ›„ 20๋ณด๋‹ค ์ž‘์œผ๋ฏ€๋กœ 20 ์™ผ์ชฝ์— ์ถ”๊ฐ€์‹œํ‚จ๋‹ค.
(f) : 35๊ฐ€ ์ž…๋ ฅ๋˜๋ฉด 30๋ณด๋‹ค ํฌ๋ฏ€๋กœ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐ€์„œ 40๊ณผ ๋น„๊ตํ•œ ์ˆ˜ 40๋ณด๋‹ค ์ž‘์œผ๋ฏ€๋กœ 40 ์™ผ์ชฝ์— ์ถ”๊ฐ€์‹œํ‚จ๋‹ค.

์ˆœ์„œ: 1. ํ•ด๋‹น ๊ฐ’์„ ๊ฒ€์ƒ‰ํ•œ๋‹ค -> ํ•ด๋‹น ๊ฐ’์ด ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ์ œ์ผ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋กœ ๊ฐ„๋‹ค. -> ์ œ์ผ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์— ์ถ”๊ฐ€์‹œํ‚จ๋‹ค.

์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์—์„œ์˜ ์‚ญ์ œ

์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์—์„œ ์‚ฝ์ž…์€ ๋…ธ๋“œ๊ฐ€ ์‚ฝ์ž…๋  ์ž๋ฆฌ๋งŒ ์ •ํ•ด์ง€๋ฉด ๊ฐ„๋‹จํ•˜์ง€๋งŒ ์‚ญ์ œ์˜ ๊ฒฝ์šฐ๋Š” ์‚ญ์ œํ•  ๋…ธ๋“œ๊ฐ€ ์ •ํ•ด์ง„ ์ดํ›„๊ฐ€ ๋” ๋ณต์žกํ•˜๋‹ค.

 

์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์—์„œ ๋…ธ๋“œr์„ ์‚ญ์ œ์ œํ•˜๊ณ ์ž ํ•  ๋•Œ๋Š” ๋‹ค์Œ ์„ธ ๊ฐ€์ง€์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 

๋‹ค๋ฅธ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ๊ฐ Case๋กœ ๋‚˜๋ˆ  ๋†จ๋‹ค.

  • Case1: r์ด ๋ฆฌํ”„ ๋…ธ๋“œ์ธ ๊ฒฝ์šฐ

Case1

r์€ ๋ฆฌํ”„๋…ธ๋“œ์ด๋ฏ€๋กœ ์ž์‹์ด ์—†์–ด r์ด ์‚ญ์ œ๋˜์–ด๋„ r์˜ ์•„๋ž˜์ชฝ์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค. ๋‹จ์ง€ r์˜ ๋ถ€๋ชจ๋…ธ๋“œ์—์„œ r์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋˜ ํฌ์ธํ„ฐ๋ฅผ NIL๋กœ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋œ๋‹ค.

18์„ ์‚ญ์ œํ•˜๋ ค๊ณ  ํ•œ๋‹ค

(a) 18์„ ํ‚ค๋กœ ๊ฐ–๋Š” ๋…ธ๋“œ๋กœ ๊ฐ€์„œ ์ž์‹์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ๋‹ค -> ์—†์Œ.
(b) ์ž์‹์ด ์—†๋‹ค๋ฉด r = NIL ๋กœ ์ œ๊ฑฐํ•œ๋‹ค.
  • Case2: r์˜ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜์ธ ๊ฒฝ์šฐ

Case2

r์€ r์„ ์ œ๊ฑฐํ•˜๋ฉด r์˜ ์ž์‹ ๋…ธ๋“œ๋กœ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€๋ฏ€๋กœ r์˜ ๋ถ€๋ชจ ๋…ธ๋“œ์—์„œ r์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋˜ ํฌ์ธํ„ฐ๋ฅผr์˜ ์ž์‹์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ๋ฐ”๊พธ์–ด์ค€๋‹ค.
(a) 30์„ ๊ฒ€์ƒ‰ํ•˜๊ณ  30์— ์ž์‹์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
(b) 30์—๋Š” ์ž์‹์ด ํ•˜๋‚˜์ธ ๊ฒƒ์„ ํ™•์ธํ•˜๊ณ  case2์ž„์„ ์ธ์ง€ํ•œ ํ›„ ์‚ญ์ œํ•œ๋‹ค. (๊ฐœ๋…์ ์ธ ์„ค๋ช…์„ ํ•˜๊ธฐ์œ„ํ•ด ์‚ญ์ œํ•œ๋‹ค๋ผ๊ณ  ํ•˜์˜€๊ณ  ์‹ค์งˆ์ ์œผ๋กœ๋Š” ๋ฐ”๋กœ C์˜ ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค)
(c) 30์€ 48๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ right[28] = 48๋กœ ์—ฐ๊ฒฐํ•œ๋‹ค.
  • Case3: r์˜ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ๋‘ ๊ฐœ์ธ ๊ฒฝ์šฐ

    ์ž์‹ ๋…ธ๋“œ๊ฐ€ ๋‘ ๊ฐœ์ธ ๊ฒฝ์šฐ์—๋Š” ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์˜ ์„ฑ์งˆ์„ ๋Š์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. ๋งŒ์•ฝ ์•„๋ž˜์˜ ๊ทธ๋ฆผ์—์„œ 28์„ ์‚ญ์ œํ•œ๋‹ค๊ณ  ํ–ˆ์„๋•Œ 40์„ 28์ด ์žˆ๋˜ ์ž๋ฆฌ์— ๋ฐฐ์น˜ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด
    ์ด์ง„ ํŠธ๋ฆฌ๊ฐ€ ๋˜์ง€ ์•Š๊ณ  ๋‹ค์ง„ ํŠธ๋ฆฌ๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ์งˆ์„ ์œ ์ง€ํ•ด์„œ ๋†“์•„์•ผ ํ•œ๋‹ค.
    Case3-1
    Case3-2
(a) 28์„ ์‚ญ์ œํ•˜๊ณ  28์˜ ๋‹ค์Œ ์›์†Œ์ธ ๊ฐ’์„ ์ฐพ๋Š”๋‹ค.
(b) ๋‹ค์Œ ์›์†Œ์˜ ๊ฐ’์„ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ right[r]์˜ left[์ตœํ•˜๋‹จ]์˜ ๊ฐ’์„ ์ฐพ๋Š”๋‹ค.
(c) ๋‹ค์Œ ์›์†Œ ๋ถ€๋ชจ ๋…ธ๋“œ๋Š” ๋‹ค์Œ ์›์†Œ๋ฅผ r์œผ๋กœ ์˜ฎ๊ธด๋‹ค.
(d) ๋‹ค์Œ ์›์†Œ๊ฐ€ ์žˆ๋˜ ์ž๋ฆฌ์— ๋‹ค์Œ ์›์†Œ์˜ ์ž์‹์„ ๋†“๋Š”๋‹ค.
 
์ด๋ฅผ Pseudo ์ฝ”๋“œ๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค๋ฉด ์กฐ๊ธˆ ๋ณต์žกํ•˜์ง€๋งŒ ํ•จ๊ป˜ ํ•ด์„ํ•ด๋ณด์ž.

t: ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ ๋…ธ๋“œ
r: ์‚ญ์ œํ•˜๊ณ ์ž ํ•˜๋Š” ๋…ธ๋“œ
p: r์˜ ๋ถ€๋ชจ ๋…ธ๋“œ

treeDelete(t, r, p){
    if(r=t) then root <-deleteNode(t); //

    else if(r=left[p]) then left[p] <-deleteNode(r); //p์˜ ์™ผ์ชฝ ์ž์‹์ธ ๊ฒฝ์šฐ
    else right[p] <- deleteNode(r); // p์˜ ์˜ค๋ฅธ์ชฝ ์ž์‹์ธ ๊ฒฝ์šฐ
}

deleteNode(r){
    if(left[r] = right[r] = NIL) then return NIL; //์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ Case1
    else if (left[r] = NIL and right[r] != NIL) then return right[r]; // ์ž์‹ ๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜์ธ ๊ฒฝ์šฐ Case2-1 (์˜ค๋ฅธ์ชฝ์— ์ž์‹์ด ์žˆ๋Š” ๊ฒฝ์šฐ)
    else if (right[r] = NIL and left != NIL) then return left[r]; // ์ž์‹ ๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜์ธ ๊ฒฝ์šฐ Case2-2 (์™ผ์ชฝ์— ์ž์‹์ด ์žˆ๋Š” ๊ฒฝ์šฐ)

    else{     // ์ž์‹ ๋…ธ๋“œ๊ฐ€ ๋‘ ๊ฐœ์ธ ๊ฒฝ์šฐ Case3
        s <- right[r]; // ์‚ญ์ œํ•˜๊ณ ์ž ํ•˜๋Š” ๋…ธ๋“œ ์˜ค๋ฅธ์ชฝ ๊ฐ’์„ 
        while(left[s] != NUL){ //๋‹ค์Œ ๊ฐ’์˜ ์™ผ์ชฝ ๋ฆฌํ”„๋…ธ๋“œ๋ฅผ ์ฐพ๋Š”๋‹ค.
            parent <- s;
            s <- left[s];
        }
        key[r] <-key[s];
        if(s=right[r]) then right[r] <-right[s];
        else left[parent] <-right[s];

        return r;
    }
}

์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ(Binary Search Tree)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„

๊ฒ€์ƒ‰์˜ ๊ฒฝ์šฐ O(log n) ์ด๋‹ค.

 

์‚ฝ์ž…์˜ ๊ฒฝ์šฐ n๊ฐœ์˜ ์›์†Œ๋กœ ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค ๋•Œ, ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์ด์ƒ์ ์œผ๋กœ ๊ท ํ˜•์ด ์žกํžˆ๋ฉด ์ตœ์•…์˜ ๊ฒฝ์šฐ๋ผ ํ•ด๋„ O(logn) ์ด์ง€๋งŒ ๊ฐ€์žฅ ๋‚˜์˜๊ฒŒ ๊ธฐ์šธ๋ณ€ ํ‰๊ท  ๊ฒ€์ƒ‰ ์‹œ๊ฐ„์ด O(n)์ด ๋œ๋‹ค.

 

์‚ญ์ œ์˜ ๊ฒฝ์šฐ Case1๊ณผ Case2๋Š” ์ƒ์ˆ˜ ์‹œ๊ฐ„์ด ๋“ค๋ฉฐ Case3์€ ๋…ธ๋“œ r์˜ ์งํ›„ ์›์†Œ๋ฅผ ์ฐพ๋Š”๋ฐ ์ตœ์•…์˜ ๊ฒฝ์šฐ ํŠธ๋ฆฌ์˜ ๋†’์ด์— ๋น„๋ก€ํ•˜๋Š” ์‹œ๊ฐ„์ด ๋“ ๋‹ค. ๋”ฐ๋ผ์„œ ์ตœ์•…์˜ ์‹œ๊ฐ„์€ ํŠธ๋ฆฌ์˜ ๋†’์ด์— ๋”ฐ๋ผ


O(log n)๊ณผ O(n) ์‚ฌ์ด์ด๋‹ค.

์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ(Binary Search Tree)์˜ ํŠน์ง•

์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ๋Š” ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(logn)์ผ ์ˆ˜๋„ ์žˆ๊ณ  O(n)์ด ๋  ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ ์ด๋Š” ํŠธ๋ฆฌ์˜ ๋†’์ด์— ๋”ฐ๋ผ ๊ฒฐ์ •๋˜๋Š” ๊ฒƒ์ด๋‹ค.


๋งŒ์•ฝ ์ด์ง„๊ฒ€์ƒ‰ํŠธ๋ฆฌ๊ฐ€ ๊ทน๋‹จ์ ์ธ ๊ตฌ์กฐ๋กœ ํ•œ ์ชฝ ๋…ธ๋“œ์—๋งŒ ๋ชฐ๋ ค์žˆ๋‹ค๋ฉด ํƒ์ƒ‰์„ ํ•  ๋•Œ ์žฌ๊ท€์  ๊ด€์ (O(logn))์œผ๋กœ ์ชผ๊ฐœ์ง€์ง€ ์•Š๋Š”๋‹ค๋ฉด ํ•œ ์ชฝ์œผ๋กœ ๊ณ„์† ํƒ์ƒ‰์„ ํ•˜์—ฌ ๊ฒฐ๊ตญ O(n)์ด ๋  ๊ฒƒ์ด๋‹ค.

 

์ด๊ฒƒ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด AVL ํŠธ๋ฆฌ๋ผ๋Š” ๊ฒƒ์ด ๋‚˜์™”๋Š”๋ฐ AVL ํŠธ๋ฆฌ๋Š” ๋‹ค์Œ์— ์•Œ์•„๋ณด๋Š” ๊ฒƒ์œผ๋กœ ํ•˜์ž.

์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ(Binary Search Tree)์˜ ์ž๋ฐ” ์†Œ์Šค ์ฝ”๋“œ

๋Œ“๊ธ€