- ํธ๋ฆฌ (Tree)
๊ณ์ธต์ ์ธ ๊ตฌ์กฐ๋ฅผ ํํํ๋ ๋ฐ ์ฌ์ฉํ๋ค.
์๋ฅผ ๋ค๋ฉด ์กฐ์ง๋๋ ๋๋ ํ ๋ฆฌ์ ์๋ธ๋๋ ํ ๋ฆฌ์ ๊ตฌ์กฐ๋ฅผ ํํํ ๋, ๊ฐ๊ณ๋๋ฅผ ํํํ ๋ ์ด๋ค.
- ํธ๋ฆฌ๋ ๋ ธ๋(node) ๋ค๊ณผ ๋ ธ๋๋ค์ ์ฐ๊ฒฐํ๋ ๋งํฌ(link)๋ค๋ก ๊ตฌ์ฑ๋๋ค.
- ๋ฃจํธ(root) : ๋งจ ์์ ๋ ธ๋
- ๋งํฌ(link) : ๋ ธ๋๋ค์ ์ฐ๊ฒฐํ๋ ์ (=edge, branch)
- ํธ๋ฆฌ์ ๋ถ๋ชจ-์์ ๊ด๊ณ
ํธ๋ฆฌ ๊ตฌ์กฐ ์์์ ์๋์ ์ผ๋ก ์์ ์๋ ๋ ธ๋๋ฅผ ๋ถ๋ชจ ๋ ธ๋๋ผ ํ๊ณ , ์๋์ ์๋ ๋ ธ๋๋ฅผ ์์ ๋ ธ๋๋ผ ํ๋ค.
- ํธ๋ฆฌ์ ํ์ ๊ด๊ณ
๋ถ๋ชจ๊ฐ ๋์ผํ ๋ ธ๋๋ค์ ํ์ (sibling) ๊ด๊ณ๋ผ๊ณ ํ๋ค.
๋ฃจํธ ๋ ธ๋๋ฅผ ์ ์ธํ ํธ๋ฆฌ์ ๋ชจ๋ ๋ ธ๋๋ค์ ์ ์ผํ ๋ถ๋ชจ ๋ ธ๋๋ฅผ ๊ฐ์ง๋ค.
- ๋ฆฌํ๋ ธ๋
์์์ด ์๋ ๋ ธ๋๋ค์ ๋ฆฌํ(leaf) ๋ ธ๋๋ผ ํ๋ค.
๋ฆฌํ๋ ธ๋๊ฐ ์๋ ๋ ธ๋๋ค์ ๋ด๋ถ(internal)๋ ธ๋๋ผ ํ๋ค.
- ํธ๋ฆฌ์ ์กฐ์-์์ ๊ด๊ณ
๋ถ๋ชจ-์์ ๊ด๊ณ๋ฅผ ํ์ฅํ ๊ฒ์ด ์กฐ์-์์ ๊ด๊ณ์ด๋ค.
- ๋ถํธ๋ฆฌ(subtree)
ํธ๋ฆฌ์์ ์ด๋ค ํ ๋ ธ๋์ ๊ทธ ๋ ธ๋์ ์์๋ค๋ก ์ด๋ฃจ์ด์ง ํธ๋ฆฌ๋ฅผ ๋ถํธ๋ฆฌ(subtree)๋ผ๊ณ ๋ถ๋ฅธ๋ค.
ํธ๋ฆฌ์์ ์ด๋ค ์ผ๋ถ๋ถ์ ์๋ผ๋ด์ด ๋ดค์ ๋ ํธ๋ฆฌ๊ฐ ๋๋ค๋ ์๋ฏธ์ด๋ค.
- ํธ๋ฆฌ์ ๋ ๋ฒจ
ํธ๋ฆฌ์ ๋ ธ๋๋ค์ ๋ ๋ฒจ๋ก ๊ตฌ๋ถํ ์ ์๋ค.
๋ฃจํธ๋ ธ๋๋ level 1 ๋๋ level 0์ด ๋๋ค. (๋ถ์ด๋ ์ฌ๋ ๋๋ฆ)
๊ทธ๋ฆฌ๊ณ ๋ฃจํธ๋ ธ๋์ ์์๋ ธ๋๋ค์ ๋ฃจํธ๋ ธ๋๊ฐ level1์ธ ๊ฒฝ์ฐ์๋ ๋ชจ๋ level2๊ฐ ๋๊ณ , ๋ฃจํธ๋ ธ๋๊ฐ level0์ธ ๊ฒฝ์ฐ์๋ ๋ชจ๋ level1์ด ๋๋ค.
- ํธ๋ฆฌ์ ๋์ด
์๋ก ๋ค๋ฅธ ๋ ๋ฒจ์ ๊ฐฏ์๋ฅผ ๋งํ๋ค.
- ํธ๋ฆฌ์ ๊ธฐ๋ณธ์ ์ธ ์ฑ์ง
- ๋ ธ๋๊ฐ N๊ฐ์ธ ํธ๋ฆฌ๋ ํญ์ N-1๊ฐ์ ๋งํฌ(link)๋ฅผ ๊ฐ์ง๋ค.
- ํธ๋ฆฌ์์ ๋ฃจํธ์์ ์ด๋ค ๋ ธ๋๋ก ๊ฐ๋ ๊ฒฝ๋ก๋ ์ ์ผํ๋ค. ๋ํ ์์์ ๋ ๋ ธ๋๊ฐ์ ๊ฒฝ๋ก๋ ์ ์ผํ๋ค. (๊ฐ์ ๋ ธ๋๋ฅผ ๋ ๋ฒ ์ด์ ๋ฐฉ๋ฌธํ์ง ์๋๋ค๋ ์กฐ๊ฑด ํ์!)
- ์ด์งํธ๋ฆฌ (binary tree)
- ์ด์ง ํธ๋ฆฌ์์ ๊ฐ ๋ ธ๋๋ ์ต๋ 2๊ฐ์ ์์์ ๊ฐ์ง๋ค.
- ๊ฐ๊ฐ์ ์์ ๋ ธ๋๋ ์์ ์ด ๋ถ๋ชจ์ ์ผ์ชฝ ์์์ธ์ง, ์ค๋ฅธ์ชฝ ์์์ธ์ง๊ฐ ์ง์ ๋๋ค. (์์์ด ํ ๋ช ์ธ ๊ฒฝ์ฐ์๋!!)
- ์ด์งํธ๋ฆฌ ์์ฉ์ ์ 1) Expression Tree
์์ ์ด์งํธ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ์์ ํํํ๋ค.
(x + y) * ( ( a + b ) / c)
- ์ด์งํธ๋ฆฌ ์์ฉ์ ์ 2) Huffman Code
: ์ด๋ค ํ ์ดํฐ๋ฅผ ์์ถ/์ธ์ฝ๋ฉํ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์๊ณ ๋ฆฌ์ฆ ์ค ํ๋์ด๋ค.
๊ฐ๋ณ ๊ธธ์ด๋ฅผ ์ธ์ฝ๋ฉํ ๋, ์๋ฅผ ๋ค์ด ์ด๋ค ํ ์คํธํ์ผ์ด ์๋๋ฐ, ๊ทธ ํ์ผ์ ๋ด์ฉ์ด ์ํ๋ฒณ a~z ๋ก ๊ตฌ์ฑ๋์ด ์๋ค๊ณ ํ ๋,
๊ทธ ํ์ผ์ ํฌ๊ธฐ๊ฐ ์ต์๊ฐ ๋๋๋ก ์ธ์ฝ๋ฉํ๋ ๋ฐฉ์์ด๋ค.
ko.wikipedia.org/wiki/%ED%97%88%ED%94%84%EB%A8%BC_%EB%B6%80%ED%98%B8%ED%99%94
- Full Binary Tree
- ๋ชจ๋ ๋ ธ๋๋ค์ด ๊ฝ๊ฝ ์ฐจ ์๋ ํธ๋ฆฌ
- ๋์ด๊ฐ h์ธ Full Binary Tree๋ 2^h-1๊ฐ์ ๋ ธ๋๋ฅผ ๊ฐ์ง๋ค.
- ๋ ธ๋๊ฐ N๊ฐ์ธ Complete Binary Tree์ ๋์ด๋ O(logN)์ด๋ค. (๋ ธ๋๊ฐ N๊ฐ์ธ ์ด์งํธ๋ฆฌ์ ๋์ด๋ ์ต์ ์ ๊ฒฝ์ฐ, N์ด ๋ ์๋ ์๋ค.)
- Complete Binary Tree
- ๋งจ ๋ง์ง๋ง ๋ ๋ฒจ์ ์ ์ธํ ๋ชจ๋ ๋ ธ๋๋ค์ ๊ฝ๊ฝ ์ฐจ ์๋ค. ๋จ ์ค๋ฅธ์ชฝ์์๋ถํฐ ๋น๋ค.
- ๋ ธ๋๊ฐ N๊ฐ์ธ Complete Binary Tree์ ๋์ด๋ O(logN)์ด๋ค. (๋ ธ๋๊ฐ N๊ฐ์ธ ์ด์งํธ๋ฆฌ์ ๋์ด๋ ์ต์ ์ ๊ฒฝ์ฐ, N์ด ๋ ์๋ ์๋ค.)
- Heap์ด ์ด์ ํด๋นํ๋ค.
- ์ด์งํธ๋ฆฌ์ ํํ : ์ฐ๊ฒฐ๋ฆฌ์คํธ
- ์ฐ๊ฒฐ๊ตฌ์กฐ(Linked Structure)์ ํํํ ๋ ์ด๋ค. ๋ํ์ ์ธ ์๊ฐ ์ฐ๊ฒฐ๋ฆฌ์คํธ. (Linked List)
- ๊ฐ ๋ ธ๋์ ํ๋์ ๋ฐ์ดํฐ ํ๋์ ์ผ์ชฝ์์(left)์ ์ฃผ์, ์ค๋ฅธ์ชฝ์์(right)์ ์ฃผ์, ๊ทธ๋ฆฌ๊ณ ๋ถ๋ชจ๋ ธ๋(p)์ ์ฃผ์๋ฅผ ์ ์ฅํ๋ค. (๋ถ๋ชจ๋ ธ๋์ ์ฃผ์๋ ๋ฐ๋์ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด ๋ณดํต ์๋ตํ๋ค..)
- ์ด์งํธ๋ฆฌ์ ์ํ (Traversal)
- ์ํ : ์ด์ง ํธ๋ฆฌ์ ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ ์ผ
- ์ค์์(in-order) ์ํ
- ์ ์์(pre-order) ์ํ
- ํ์์(post-order) ์ํ
- ๋ ๋ฒจ์ค๋(level-order) ์ํ
์ค์์, ์ ์์, ํ์์๋ ๋ฃจํธ ๋ ธ๋๋ฅผ ๋ช ๋ฒ์งธ ๋ฐฉ๋ฌธํ๋๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์๊ฐํ๋ฉด ๋๋ค.
์ค์์ ์ํ๋ ๋ฃจํธ๋ ธ๋๋ฅผ ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ ์ค๊ฐ์ ๋ฐฉ๋ฌธํ๋ค.
์ ์์ ์ํ๋ ๋ฃจํธ๋ ธ๋๋ฅผ ์ผ์ชฝ, ์ค๋ฅธ์ชฝ๋ณด๋ค ๊ฐ์ฅ ๋จผ์ ๋ฐฉ๋ฌธํ๋ค.
ํ์์ ์ํ๋ ๋ฃจํธ๋ ธ๋๋ฅผ ์ผ์ชฝ, ์ค๋ฅธ์ชฝ์ ๋ชจ๋ ๋ฐฉ๋ฌธํ ํ์ ๋ฐฉ๋ฌธํ๋ค.
* ์ค์์ ์ํ
1. ๋จผ์ ํธ๋ฆฌ์ ์ผ์ชฝ์ inorder๋ก ์ํํ๊ณ ,
2. ๋ฃจํธ๋ฅผ ์ํํ๊ณ ,
3. ํธ๋ฆฌ์ ์ค๋ฅธ์ชฝ์ inorder๋ก ์ํํ๋ค.
๋ค์์ ๊ฐ๊ฐ์ ํํํ ์์ฌ์ฝ๋์ด๋ค.
// ์ค์์ ์ํ
INORDER-TREE-WALK(x){
if x != null
then
INORDER-TREE-WALK(left[x])
print key[x]
then INORDER-TREE-WALK(rignt[x])
}
// ์ ์์ ์ํ
PREORDER-TREE-WALK(x){
if x != null
then
print key[x]
PREORDER-TREE-WALK(left[x])
PREORDER-TREE-WALK(right[x])
}
// ํ์์ ์ํ
POSTORDER-TREE-WALK(x){
if x != null
then
POSTORDER-TREE-WALK(left[x])
POSTORDER-TREE-WALK(rignt[x])
print key[x]
}
- Expression Trees
์์ Expression Tree๋ฅผ inorder ์ํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ถ๋ ฅ๋๋ค.
x + y * a + b / c
๊ฐ ๋ถํธ๋ฆฌ๋ฅผ ์ํํ ๋, ์์๊ณผ ์ข ๋ฃ์์ ๊ดํธ๋ฅผ ์ถ๊ฐํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฌ๋ฐ๋ฅธ ์์์ด ์ถ๋ ฅ๋๋ค.
(x + y) * ((a + b) / c)
Postorder ์ํํ๋ฉด ํ์ํ๊ธฐ์์ด ์ถ๋ ฅ๋๋ค.
x y + a b + c / *
- ๋ ๋ฒจ ์ค๋ ์ํ (Level-Order)
- ๋ ๋ฒจ ์์ผ๋ก ๋ฐฉ๋ฌธ, ๋์ผ ๋ ๋ฒจ์์๋ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ ์์๋ก ๋ฐฉ๋ฌธํ๋ค.
- ํ(queue)๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํํ๋ค.
์์ ํธ๋ฆฌ๋ฅผ ์๋ก ๋ค๋ฉด, * + / x y + c a b ์ด๋ค.
// Level-Order ์ํ
LEVEL-ORDER-TREE-TRAVERSAL()
visit the root;
Q <- root; // Q is a queue
while Q is not empty, do
V <- dequeue(Q) // dequeue ๋, ํ์์ ๊บผ๋ธ๋ค๋ ๋ป
visit children of v;
enqueue children of v into Q;
end
end
'์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
12-1๊ฐ. ๋ ๋๋ธ๋ํธ๋ฆฌ(1) (0) | 2020.11.17 |
---|---|
11-3๊ฐ. ์ด์ง๊ฒ์ํธ๋ฆฌ (Binary Search Tree) (3) | 2020.11.15 |
์ 11-1๊ฐ. ์ด์ง๊ฒ์ํธ๋ฆฌ(Binary Search Tree) (0) | 2020.11.10 |
9๊ฐ. Java์์์ ์ ๋ ฌ (0) | 2020.11.05 |
10. ํฉ๋ณ์ ๋ ฌ (merge sort) (3) | 2020.10.15 |
๋๊ธ