โท ํธ๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก ๋์ ์ ๋ณด์ ๊ฐ ํญ๋ชฉ๋ค์ ๊ณ์ธต์ ์ผ๋ก ์ฐ๊ด๋๋๋ก ๊ตฌ์กฐํ์ํค๊ณ ์ ํ ๋ ์ฌ์ฉํ๋ ๋น์ ํ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
โถ ๋ฐ์ดํฐ ์์๋ค์ ๋จ์ํ ๋์ด์ด ์๋ ๋ถ๋ชจ-์์ ๊ด๊ณ์ ๊ณ์ธต์ ๊ตฌ์กฐ๋ก ํํ์ด ๋๋ค. ํธ๋ฆฌ๋ ๊ทธ๋ํ์ ํ ์ข ๋ฅ์ด๋ฉฐ ์ฌ์ดํด์ด ์๋ค.
โท ๋ฃจํธ ๋ ธ๋(root node) : ๋ถ๋ชจ๊ฐ ์๋ ๋ ธ๋, ํธ๋ฆฌ๋ ํ๋์ ๋ฃจํธ ๋ ธ๋๋ง์ ๊ฐ์ง๋ค.
โถ ๋ ธ๋(node) : ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๊ณ ์๋ ๊ฐ ์์
โท ๊ฐ์ (edge) : ๋ ธ๋๋ฅผ ์ฐ๊ฒฐํ๋ ์ (link, branch ๋ผ๊ณ ๋ ๋ถ๋ฆ)
โถ ํ์ (sibling) : ๊ฐ์ ๋ถ๋ชจ๋ฅผ ๊ฐ์ง๋ ๋ ธ๋
โท ๋ ธ๋์ ๋ ๋ฒจ(level) : ํธ๋ฆฌ์ ํน์ ๊น์ด๋ฅผ ๊ฐ์ง๋ ๋ ธ๋์ ์งํฉ
โถ ๋ ธ๋์ ์ฐจ์(degree) : ํ์ ํธ๋ฆฌ ๊ฐ์ / ๊ฐ์ ์(degree) = ๊ฐ ๋ ธ๋๊ฐ ์ง๋ ๊ฐ์ง์ ์
โ ๊ฐ ๋
ธ๋๊ฐ ์ต๋ ๋ ๊ฐ์ ์์์ ๊ฐ๋ ํธ๋ฆฌ
โ ๋ชจ๋ ํธ๋ฆฌ๊ฐ ์ด์ง ํธ๋ฆฌ๋ ์๋๋ค.
โ ์ด์งํธ๋ฆฌ๋ ์์ ์ด์ง ํธ๋ฆฌ(Complete Binary Tree)์ ํฌํ ์ด์ง ํธ๋ฆฌ(Perfect Binary Tree), ์ ์ด์ง ํธ๋ฆฌ(Full Binary Tree)๋ผ๊ณ ํ๋ ํน๋ณํ ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ ์ํ ์ ์๋ค.
โ ํธ๋ฆฌ์ ๋ชจ๋ ๋์ด์์ ๋
ธ๋๊ฐ ๊ฝ ์ฐจ ์๋ ์ด์ง ํธ๋ฆฌ. ์ฆ, ๋ง์ง๋ง ๋ ๋ฒจ์ ์ ์ธํ๊ณ ๋ชจ๋ ๋ ๋ฒจ์ด ์์ ํ ์ฑ์์ ธ ์๋ค.
โ ๋ง์ง๋ง ๋ ๋ฒจ์ ๊ฝ ์ฐจ ์์ง ์์๋ ๋์ง๋ง ๋
ธ๋๊ฐ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ฑ์์ ธ์ผ ํ๋ค.
โ ๋ชจ๋ ๋
ธ๋๊ฐ 0๊ฐ ๋๋ 2๊ฐ์ ์์ ๋
ธ๋๋ฅผ ๊ฐ๋ ํธ๋ฆฌ
โ ๋ชจ๋ ๋ ๋ฒจ์ ๋
ธ๋๊ฐ ์ฐจ์๋ ์ํ๋ก ์ต๋ ๋
ธ๋ ์์ธ 2^k-1๊ฐ๋ก ์ฑ์์ ธ ์๋ ํธ๋ฆฌ
โ ์ ์ด์ง ํธ๋ฆฌ์ด๋ฉด์ ์์ ์ด์ง ํธ๋ฆฌ์ธ ๊ฒฝ์ฐ
a. ์ค์ ์ํ(in-order traversal) : ์ผ์ชฝ ๊ฐ์ง -> ํ์ฌ ๋ ธ๋(๋ฃจํธ) -> ์ค๋ฅธ์ชฝ ๊ฐ์ง
def inorder(node) :
if node.left != None :
inorder(tree[node.left])
print(node.item, end = ' ')
if node.right != None :
inorder(tree[node.right])
b. ์ ์ ์ํ(pre-order traversal) : ํ์ฌ ๋ ธ๋(๋ฃจํธ) -> ์ผ์ชฝ ๊ฐ์ง -> ์ค๋ฅธ์ชฝ ๊ฐ์ง
def preorder(node) :
print(node.item, end = ' ')
if node.left != None :
inorder(tree[node.left])
if node.right != None :
inorder(tree[node.right])
c. ํ์ ์ํ(post-order traversal) : ์ผ์ชฝ ๊ฐ์ง -> ์ค๋ฅธ์ชฝ ๊ฐ์ง -> ํ์ฌ ๋ ธ๋(๋ฃจํธ)
def postorder(node) :
if node.left != None :
inorder(tree[node.left])
if node.right != None :
inorder(tree[node.right])
print(node.item, end = ' ')
๋ชจ๋ ๋ ธ๋๊ฐ ์์ ์ ์ผ์ชฝ ์๋ธํธ๋ฆฌ์๋ ํ์ฌ๋ ธ๋๋ณด๋ค ์์ ํค๊ฐ์ด, ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์๋ ํ์ฌ ๋ ธ๋๋ณด๋ค ํฐ ๊ฐ์ด ์ค๋ ๊ท์น์ ๋ง์กฑํ๋ ์ด์งํธ๋ฆฌ์ด๋ค.
๐ ๋ชจ๋ ์ผ์ชฝ ์์๋ค <= n < ๋ชจ๋ ์ค๋ฅธ์ชฝ ์์๋ค (๋ชจ๋ ๋ ธ๋ n์ ๋ํด์ ๋ฐ๋์ ์ฐธ)
๐ ์์ ์ด์ง ํธ๋ฆฌ์ ์ผ์ข
์ผ๋ก ์ฐ์ ์์ ํ๋ฅผ ์ํ์ฌ ๋ง๋ค์ด์ง ์๋ฃ๊ตฌ์กฐ์ด๋ค.
์ฌ๋ฌ ๊ฐ์ ๊ฐ๋ค ์ค์์ ์ต๋๊ฐ์ด๋ ์ต์๊ฐ์ ๋น ๋ฅด๊ฒ ์ฐพ์๋ด๋๋ก ๋ง๋ค์ด์ง ์๋ฃ๊ตฌ์กฐ์ด๋ค.
๐ ํธ๋ฆฌ์ ๋ง์ง๋ง ๋จ๊ณ์์ ์ค๋ฅธ์ชฝ ๋ถ๋ถ์ ๋บ ๋๋จธ์ง ๋ถ๋ถ์ด ๊ฐ๋ ์ฑ์์ ธ ์๋ ์์ ์ด์ง ํธ๋ฆฌ์ด๋ค.
์ต์ ํ(min heap)
๋ถ๋ชจ ๋
ธ๋์ ํค ๊ฐ์ด ์์ ๋
ธ๋์ ํค ๊ฐ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ ์ด์ง ํธ๋ฆฌ
key(๋ถ๋ชจ ๋
ธ๋) <= key(์์ ๋
ธ๋)
์ต๋ ํ(max heap)
๋ถ๋ชจ ๋
ธ๋์ ํค ๊ฐ์ด ์์ ๋
ธ๋์ ํค ๊ฐ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ์์ ์ด์ง ํธ๋ฆฌ
key(๋ถ๋ชจ ๋
ธ๋) >= key(์์ ๋
ธ๋)
MAX - Heapify
ํธ๋ฆฌ์ ์ ์ฒด ๋ชจ์์ complete binary tree์ด๋ค. ์ผ์ชฝ ๋ถํธ๋ฆฌ(subtree)๋ ๊ทธ ์์ฒด๋ก heap์ด๊ณ , ์ค๋ฅธ์ชฝ ๋ถํธ๋ฆฌ(subtree)๋ ๊ทธ ์์ฒด๋ก heap์ผ ๋ ์ ์ผํ๊ฒ ๋ฃจํธ๋ง์ด heap property๋ฅผ ๋ง์กฑํ์ง ์์ ๋ heap property๋ฅผ ๋ง์กฑํ๋๋ก ๋ง๋ค์ด์ฃผ๋ ๊ฒ์ด๋ค.
โญ ๋ฐฉ๋ฒ : ๋ ์์๋ค ์ค ๋ ํฐ ์ชฝ๊ณผ exchange ํ๋ค. ์ด๊ฑธ ๋ฐ๋ณตํ๋ฉด ๋๋ค.
์ฃผ์ด์ง ๋ฐ์ดํฐ๋ก ํ์ ๋ง๋ ๋ค
ํ์์ ์ต๋๊ฐ(๋ฃจํธ)์ ๊ฐ์ฅ ๋ง์ง๋ง ๊ฐ๊ณผ ๋ฐ๊พผ๋ค
ํ์ ํฌ๊ธฐ๊ฐ 1 ์ค์ด๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ค. ์ฆ, ๊ฐ์ฅ ๋ง์ง๋ง ๊ฐ์ ํ์ ์ผ๋ถ๊ฐ ์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ค
๋ฃจํธ ๋ ธ๋์ ๋ํด์ Heapify(1)ํ๋ค
2~4๋ฒ์ ๋ฐ๋ณตํ๋ค
๐ฅ ์์ ์ด์ง ํธ๋ฆฌ, ์ด์ง ํ์ ํธ๋ฆฌ, heap์ ์ ์๋ฅผ ์ ํํ ์์๋๊ณ ํท๊ฐ๋ฆฌ์ง ์๋๋ก ํ์! ๐ฅ