์ด์งํ์ํธ๋ฆฌ(Binary Search Tree)
๐ข ์ด์งํ์ํธ๋ฆฌ(Binary Search Tree)
-
๋ด๋ถ๋ ธ๋์ (ํค,์์)์์ ์ ์ฅํ๋ฉฐ ๋ค์์ ์ฑ์ง์ ๋ง์กฑํ๋ ์ด์งํธ๋ฆฌ
์ฑ์ง
ํธ๋ฆฌ๋ ธ๋ u,v,w๊ฐ ์์๋, u์ w๊ฐ ๊ฐ๊ฐ v์ ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ ๋ถํธ๋ฆฌ์ ์กด์ฌํ ๋ Key(u) < Key(v) < Key(w) ์ฑ๋ฆฝ -
์ ์ : ์ ์ ์ด์งํธ๋ฆฌ๋ก ๊ตฌํ
-
์ด์งํ์ํธ๋ฆฌ๋ฅผ ์ค์์ํ(Inorder Traversal)ํ๋ฉด ํค๊ฐ ์ฆ๊ฐํ๋ ์์๋ก ๋ฐฉ๋ฌธํ๋ค.
-
์ด์งํ์ ํธ๋ฆฌ ์
๐ข ์ด์งํ์ํธ๋ฆฌ ํ์
-
Key๋ฅผ ์ฐพ๊ธฐ ์ํด, ๋ฃจํธ์์ ์ถ๋ฐํ๋ ํํฅ ๊ฒฝ๋ก๋ฅผ ์ถ์ ํ๋ค.
-
๋ค์ ๋ฐฉ๋ฌธํ ๋ ธ๋๋ Key์ ํ์ฌ ๋ ธ๋์ Key์ ํฌ๊ธฐ๋ฅผ ๋น๊ตํ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ๊ฒฐ์ ํ๋ค.
- ์ธ๋ถ๋ ธ๋(External Node, ๋ฆฌํ๋ ธ๋(Leaf Node))์ ๋ค๋ค๋ฅด๋ฉด, ์ฐพ๋ Key๊ฐ ๋ฐ๊ฒฌ๋์ง ์์ ๊ฒ์ด๋ค.
๐ข ์ด์งํ์ํธ๋ฆฌ ์ฝ์
-
์ฐ์ Key๋ฅผ ํ์ํ๋ค.
-
Key๊ฐ ํ์ฌ ์ด์งํ์ํธ๋ฆฌ์ ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ ๐ ํ์์ ์ธ๋ถ๋ ธ๋(w๋ก ๊ฐ์ )์ ๋์ฐฉ
-
๋์ฐฉํ ์ธ๋ถ๋ ธ๋ w์ Key๋ฅผ ์ฝ์ ํ ํ ๐ ์ด ์ธ๋ถ๋ ธ๋๋ฅผ ๋ด๋ถ๋ ธ๋๋ก ํ์ฅํด์ค์ผ ํ๋ค.
-
์ฌ๊ธฐ์ ์ธ๋ถ๋ ธ๋ ๐ Key๊ฐ์ ๊ฐ์ง์ง ์์ ํธ๋ฆฌ์ ๋ง๋จ์ ์์นํ ๋ ธ๋
๋ด๋ถ๋ ธ๋ ๐ Key๊ฐ์ ๊ฐ์ง๊ณ ์๋ ๋ ธ๋
Alg insertItem(K, E) // ์ด์งํ์ํธ๋ฆฌ ์ฝ์
input binary search tree T, Key K, element E
output none
w <- treeSearch(root(),K) // ์ผ๋จ, ์ด์งํ์์ผ๋ก, K๋ฅผ Key๊ฐ์ผ๋กํ๋ ๋
ธ๋๊ฐ ํ์ฌ ์๋ ํ์
if(isInternal(w)) // ๋ฐํ๋ w๋
ธ๋๊ฐ ๋ด๋ถ๋
ธ๋ -> ์ด๋ฏธ ์ด์งํ์ํธ๋ฆฌ ๋ด์ ์กด์ฌํ๋ค๋ ๊ฒ
return // ์ฝ์
ํ ํ์ X -> ์ข
๋ฃ
else // ์ธ๋ถ๋
ธ๋์ธ ๊ฒฝ์ฐ
Set node w to (K, E) // w๋
ธ๋์ Key๊ฐ์ K, ์์๋ฅผ E๋ก ์ ์ฉํ๊ณ
expandExternal(w) // โ
์ด w๋
ธ๋๋ฅผ ๋ด๋ถ๋
ธ๋๋ก ํ์ฅํ๋ค.
return
Alg expandExternal(z)
input external node z
output none
l <- getnode()
r <- getnode()
l.left <- Ø
l.right <- Ø
l.parent <- z
r.left <- Ø
r.right <- Ø
r.parent <- z
z.left <- l
z.right <- r
return
๐ข ์ด์งํ์ํธ๋ฆฌ ์ญ์
-
ํฌ๊ฒ Case 1, Case 2๋ก ๋๋๋ค.
-
Case 1 ๐ ์ญ์ ํ Key๋ฅผ ๊ฐ์ง ๋ ธ๋์ ์์ชฝ ์์ ๋ ธ๋ ์ค ํ๋๊ฐ ์ธ๋ถ๋ ธ๋์ผ ๊ฒฝ์ฐ
Case 2 ๐ ์ญ์ ํ Key๋ฅผ ๊ฐ์ง ๋ ธ๋์ ์์ชฝ ์์ ๋ ธ๋ ๋ ๋ค ๋ด๋ถ๋ ธ๋์ผ ๊ฒฝ์ฐ โ
๐ ์ด์งํ์ํธ๋ฆฌ ์ญ์ ( Case 1. ์ญ์ ํ ๋ ธ๋ ์์ชฝ ์์๋ ธ๋ ์ค ํ๋๊ฐ ์ธ๋ถ๋ ธ๋์ธ ๊ฒฝ์ฐ )
-
์ญ์ ํ ๋ ธ๋์ ์์ชฝ ์์ ๋ ธ๋ ์ค ํ๋๊ฐ ์ธ๋ถ๋ ธ๋์ผ ๊ฒฝ์ฐ์ด๋ค.
-
์ฐ์ ์ญ์ ํ Key๋ฅผ ํ์
-
Key๊ฐ ํธ๋ฆฌ์ ์กด์ฌํ ๊ฒฝ์ฐ, ํ์์ Key๋ฅผ ์ ์ฅํ๊ณ ์๋ ๋ ธ๋(w๋ผ ๊ฐ์ )์ ๋์ฐฉ
-
๋ ธ๋ w์ ์์ ์ค ํ๋๊ฐ ์ธ๋ถ๋ ธ๋(z๋ผ ๊ฐ์ )๋ผ๋ฉด, ๋ ธ๋ w์ ์ถ์๊ณผ์ ์ ํตํด, w, z๋ฅผ ํธ๋ฆฌ๋ก๋ถํฐ ์ญ์ ํ๋ค.
๐ ์ด์งํ์ํธ๋ฆฌ ์ญ์ ( Case.2 ์ญ์ ํ ๋ ธ๋์ ์์ชฝ ์์๋ ธ๋๊ฐ ๋ ๋ค ๋ด๋ถ๋ ธ๋ ์ผ ๊ฒฝ์ฐ ) โ
-
์ญ์ ํ ๋ ธ๋์ ์์ชฝ ์์๋ ธ๋ ๋ ๋ค ๋ด๋ถ๋ ธ๋์ผ ๊ฒฝ์ฐ์ด๋ค. ( ์ด ๋ ์ญ์ ํ ๋ ธ๋๋ w๋ผ ๊ฐ์ )
-
1. ํธ๋ฆฌ T์ ๋ํด w์ ์ค์์ํ ๊ณ์น์ y์ ๊ทธ ์์๋ ธ๋ z๋ฅผ ์ฐพ์๋ธ๋ค.
-
๋ ธ๋ y๋ ์ฐ์ w์ ์ค๋ฅธ์ชฝ ์์์ผ๋ก ์ด๋ํ ํ, ๊ฑฐ๊ธฐ์๋ถํฐ ์ผ์ชฝ ์์๋ค๋ง์ ๋๊น์ง ๋ฐ๋ผ ๋ด๋ ค๊ฐ๋ฉด ๋๋ฌํ๊ฒ ๋๋ ๋ง์ง๋ง ๋ด๋ถ๋ ธ๋์ด๋ฉฐ, ๋ ธ๋ z๋ y์ ์ผ์ชฝ ์์์ธ ์ธ๋ถ๋ ธ๋
-
y๋ T๋ฅผ ์ค์์ํํ ๊ฒฝ์ฐ, ๋ ธ๋ w๋ฐ๋ก ๋ค์์ ๋ฐฉ๋ฌธํ๊ฒ ๋๋ ๋ด๋ถ๋ ธ๋์ด๋ฏ๋ก, w์ ์ค์์ํ ๊ณ์น์(Inorder successor)๋ผ ๋ถ๋ฆฐ๋ค.
-
๋ฐ๋ผ์, y๋ w์ ์ค๋ฅธ์ชฝ ๋ถํธ๋ฆฌ ๋ด ๋ ธ๋ ์ค ๊ฐ์ฅ ์ผ์ชฝ์ผ๋ก ๋์ถ๋ ๋ด๋ถ๋ ธ๋์ด๋ค.
-
-
2. y์ ๋ด์ฉ์ w์ ๋ณต์ฌ
-
3. reduceExternal(z) ์์ ์ ์ฌ์ฉํด์ ๋ ธ๋ y์ z๋ฅผ ์ญ์
Alg removeElement(K)
input binary search tree T, Key K
output element with Key K
W <- treeSearch(root(),K)
// Key K๋ฅผ ๊ฐ์ง๋ T๋ด์ ์ฐพ์ w๋
ธ๋๊ฐ ์ธ๋ถ๋
ธ๋์ธ ๊ฒฝ์ฐ
if(isExternal(W))
return NoSuchKey
// Key K๋ฅผ ๊ฐ์ง๋ T๋ด์ ์ฐพ์ W๋
ธ๋๊ฐ ์ธ๋ถ๋
ธ๋์ธ ๊ฒฝ์ฐ
e <- element(W)
z <- leftChild(W)
if(!(isExternal(z))
z <- rightChild(W)
if(isExternal(z)) // Case 1. ์ญ์ ํ W๋
ธ๋์, ์์ชฝ ์์๋
ธ๋ ์ค ํ๋๊ฐ ์ธ๋ถ๋
ธ๋์ธ ๊ฒฝ์ฐ
reduceExternal(z)
else // Case 2. ์ญ์ ํ W๋
ธ๋์, ์์ชฝ ์์๋
ธ๋ ๋ ๋ค ๋ด๋ถ๋
ธ๋์ธ ๊ฒฝ์ฐ โ
y <- inOrderSucc(W) // W์ ์ค์์ํ๊ณ์น์( ์ฆ, W๋
ธ๋์ Key๊ฐ ๋ฐ๋ก ๋ค์์ผ๋ก ํฐ, Key๊ฐ์ ๊ฐ์ง ๋
ธ๋ ), y
z <- leftChild(y) // ์ค์์ํ๊ณ์น์ y๋
ธ๋์ ์ผ์ชฝ ์์๋
ธ๋๊ฐ z
Set node W to (Key(y),element(y)) // ์ญ์ ํ๋ค๋ ๊ฐ๋
์ผ๋ก, ์ญ์ ํ W๋
ธ๋์ key๊ฐ๊ณผ element๊ฐ์ y์ Key,element๋ก ๋ณ๊ฒฝ
reduceExternal(z) // y์ ๋ํด, ๋ด๋ถ๋
ธ๋ ์ถ์๊ณผ์
return e
๐ข ์ด์งํ์ํธ๋ฆฌ์ ์ฑ๋ฅ
-
๋์ด h์ ์ด์งํ์ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ๋ N ํญ๋ชฉ์ ์ฌ์ ์ ๊ฐ์ ํด๋ณด์.
-
O(N) ๊ณต๊ฐ์ ์ฌ์ฉํ๋ค.
-
ํ์,์ฝ์ ,์ญ์ ์์ ๋ชจ๋ O(h)์๊ฐ์ ์ํ
-
๋์ด h๋
1. ์ต์ ์ ๊ฒฝ์ฐ ๐ O(N)2. ์ต์ ์ ๊ฒฝ์ฐ ๐ O(log(N))
๐ข ์ฐธ๊ณ
-
๋์ผํ ํค ์ง๋จ์ผ๋ก ์์ฑ๋ ์ด์งํ์ํธ๋ฆฌ์์, ์ฝ์ ์์์๋ ์๊ด์์ด ํญ์ ๋์ผํ ์ด์งํ์ํธ๋ฆฌ๊ฐ ์์ฑ๋๋ค ?๐ NO !!
- ๊ฐ๋จํ ์๋ก ํ์ธ๊ฐ๋ฅ ๐ [ 9,5,12,7,13 ] ์์์ [ 9,7,12,5,13 ] ์์๋ก ์์ฑ๋๋ ์ด์งํ์ํธ๋ฆฌ์ ๋ชจ์์ ๋ค๋ฅด๋ค.