์ด์ง ๊ฒ์ ํธ๋ฆฌ(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์ด ๋ฆฌํ ๋ ธ๋์ธ ๊ฒฝ์ฐ
r์ ๋ฆฌํ๋ ธ๋์ด๋ฏ๋ก ์์์ด ์์ด r์ด ์ญ์ ๋์ด๋ r์ ์๋์ชฝ์๋ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค. ๋จ์ง r์ ๋ถ๋ชจ๋ ธ๋์์ r์ ๊ฐ๋ฆฌํค๊ณ ์๋ ํฌ์ธํฐ๋ฅผ NIL๋ก ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋ค.
18์ ์ญ์ ํ๋ ค๊ณ ํ๋ค
(a) 18์ ํค๋ก ๊ฐ๋ ๋ ธ๋๋ก ๊ฐ์ ์์์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ค -> ์์.
(b) ์์์ด ์๋ค๋ฉด r = NIL ๋ก ์ ๊ฑฐํ๋ค.
-
Case2: r์ ์์ ๋ ธ๋๊ฐ ํ๋์ธ ๊ฒฝ์ฐ
r์ r์ ์ ๊ฑฐํ๋ฉด r์ ์์ ๋ ธ๋๋ก ์ฐ๊ฒฐ์ด ๋์ด์ง๋ฏ๋ก r์ ๋ถ๋ชจ ๋ ธ๋์์ r์ ๊ฐ๋ฆฌํค๊ณ ์๋ ํฌ์ธํฐ๋ฅผr์ ์์์ ๊ฐ๋ฆฌํค๋๋ก ๋ฐ๊พธ์ด์ค๋ค.
(a) 30์ ๊ฒ์ํ๊ณ 30์ ์์์ด ์๋์ง ํ์ธํ๋ค.
(b) 30์๋ ์์์ด ํ๋์ธ ๊ฒ์ ํ์ธํ๊ณ case2์์ ์ธ์งํ ํ ์ญ์ ํ๋ค. (๊ฐ๋ ์ ์ธ ์ค๋ช ์ ํ๊ธฐ์ํด ์ญ์ ํ๋ค๋ผ๊ณ ํ์๊ณ ์ค์ง์ ์ผ๋ก๋ ๋ฐ๋ก C์ ๊ณผ์ ์ ๊ฑฐ์น๋ค)
(c) 30์ 48๊ณผ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฏ๋ก right[28] = 48๋ก ์ฐ๊ฒฐํ๋ค.
-
Case3: r์ ์์ ๋ ธ๋๊ฐ ๋ ๊ฐ์ธ ๊ฒฝ์ฐ
์์ ๋ ธ๋๊ฐ ๋ ๊ฐ์ธ ๊ฒฝ์ฐ์๋ ์ด์ง ๊ฒ์ ํธ๋ฆฌ์ ์ฑ์ง์ ๋์ง ์๋ ๊ฒ์ด ์ค์ํ๋ค. ๋ง์ฝ ์๋์ ๊ทธ๋ฆผ์์ 28์ ์ญ์ ํ๋ค๊ณ ํ์๋ 40์ 28์ด ์๋ ์๋ฆฌ์ ๋ฐฐ์นํ๊ฒ ๋๋ค๋ฉด
์ด์ง ํธ๋ฆฌ๊ฐ ๋์ง ์๊ณ ๋ค์ง ํธ๋ฆฌ๊ฐ ๋๊ธฐ ๋๋ฌธ์ ์ฑ์ง์ ์ ์งํด์ ๋์์ผ ํ๋ค.
(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)์ ์๋ฐ ์์ค ์ฝ๋
'๐ป Computer Science > - Data Structure, Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ-์ด๋ก ] ํด์ ํ ์ด๋ธ (Hash Table) (0) | 2019.11.23 |
---|---|
[์๊ณ ๋ฆฌ์ฆ-์ด๋ก ] ๋ ๋ ๋ธ๋ ํธ๋ฆฌ(Red-Black Tree) (0) | 2019.11.23 |
[์๊ณ ๋ฆฌ์ฆ-์ด๋ก ] ํต ์ ๋ ฌ (Quick Sort) (0) | 2019.11.23 |
[์๊ณ ๋ฆฌ์ฆ-์ด๋ก ] ๋ณํฉ ์ ๋ ฌ(Merge Sort) (0) | 2019.11.23 |
[์๊ณ ๋ฆฌ์ฆ-์ด๋ก ] ์ฝ์ ์ ๋ ฌ (Insertion Sort) (0) | 2019.11.23 |
๋๊ธ