๋ฆฌ์คํธ, ์คํ, ํ ๋ฑ์ ์๋ฃ๋ค์ด ์ง์ ๊ณผ ๊ฐ์ด ๋์ด๋์ด ์๋ ์ ํ ์๋ฃ ๊ตฌ์กฐ(linear data structure)์ด๋ค. ์ด๋ฐ ์๋ฃ๊ตฌ์กฐ๋ ๊ณ์ธต ๊ด๊ณ๋ฅผ ํํํ๊ธฐ์ ์ ํฉํ์ง ์๋ค. ํธ๋ฆฌ(tree)๋ ์กฐ์๊ณผ ์์, ์ ์ฒด์ ๋ถ๋ถ, ์ปดํจํฐ์ ๋๋ ํฐ๋ฆฌ ๊ตฌ์กฐ ๋ฑ์ ๊ณ์ธต์ ์ธ ์๋ฃ๋ฅผ ํํํ๋๋ฐ ์ด์ฉ๋๋ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
ํธ๋ฆฌ(Tree) ์๋ฃ๊ตฌ์กฐ
๐ก ํธ๋ฆฌ์ ๊ด๋ จ๋ ์ฉ์ด
- ๋ ธ๋(node): ํธ๋ฆฌ์ ๊ตฌ์ฑ ์์
- ๋ฃจํธ(root) ๋ ธ๋: ๊ณ์ธต ๊ตฌ์กฐ์์ ๊ฐ์ฅ ๋์ ๊ณณ์ ์๋ ๋ ธ๋
- ์๋ธ ํธ๋ฆฌ(subtree): ํธ๋ฆฌ์์ ๋ฃจํธ ๋ ธ๋๋ฅผ ์ ์ธํ ๋ ธ๋๋ค
- ๊ฐ์ (edge): ๋ฃจํธ์ ์๋ธ ํธ๋ฆฌ๋ฅผ ์ฐ๊ฒฐํ๋ ์
- ๋จ๋ง ๋ ธ๋(terminal node/leaf node): ์์ ๋ ธ๋๊ฐ ์๋ ๋ ธ๋
- ๋น๋จ๋ง ๋ ธ๋(nonterminal node): ์์ ๋ ธ๋๊ฐ ์๋ ๋ ธ๋
- ์ฐจ์(degree): ์ด๋ค ๋ ธ๋๊ฐ ๊ฐ์ง๊ณ ์๋ ์์ ๋ ธ๋์ ๊ฐ์
- ํธ๋ฆฌ์ ์ฐจ์: ํธ๋ฆฌ๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ ธ๋์ ์ฐจ์ ์ค์์ ๊ฐ์ฅ ํฐ ์ฐจ์
- ๋ ๋ฒจ(level): ํธ๋ฆฌ์ ๊ฐ ์ธต์ ๋ฒํธ๋ฅผ ๋งค๊ธด ๊ฒ ({A(๋ฃจํธ)} ๋ ๋ฒจ 1, {B, C, D}์ ๋ ๋ฒจ 2, ...)
- ํธ๋ฆฌ์ ๋์ด(height): ํธ๋ฆฌ๊ฐ ๊ฐ์ง๊ณ ์๋ ์ต๋ ๋ ๋ฒจ
๐ก ์ด์ง ํธ๋ฆฌ(Binary Tree)
๋ชจ๋ ๋ ธ๋๊ฐ 2๊ฐ์ ์๋ธ ํธ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ์๋ ํธ๋ฆฌ๋ฅผ ์ด์ง ํธ๋ฆฌ(binary tree)๋ผ๊ณ ํ๋ค. ์ด๋ ์๋ธ ํธ๋ฆฌ๋ ๊ณต์งํฉ์ผ ์ ์๋ค.
<์ด์ง ํธ๋ฆฌ์ ์ํ์ ์ ์>
- ๊ณต์งํฉ์ด๊ฑฐ๋
- ๋ฃจํธ์ ์ผ์ชฝ ์๋ธ ํธ๋ฆฌ, ์ค๋ฅธ์ชฝ ์๋ธ ํธ๋ฆฌ๋ก ๊ตฌ์ฑ๋ ๋ ธ๋๋ค์ ์ ํ ์งํฉ์ผ๋ก ์ ์๋๋ค. ์ด์ง ํธ๋ฆฌ์ ์๋ฒ ํธ๋ฆฌ๋ค์ ๋ชจ๋ ์ด์ง ํธ๋ฆฌ์ฌ์ผ ํ๋ค.
<์ด์ง ํธ๋ฆฌ์ ์ฑ์ง>
- n๊ฐ์ ๋
ธ๋๋ฅผ ๊ฐ์ง ์ด์ง ํธ๋ฆฌ๋ (n - 1) ๊ฐ์ ๊ฐ์ ์ ๊ฐ์ง๋ค.
- ์ด์ง ํธ๋ฆฌ์์ ๋ฃจํธ๋ฅผ ์ ์ธํ ๋ ธ๋๋ ํ๋์ ๋ถ๋ชจ ๋ ธ๋๋ง์ ๊ฐ์ง - ๋์ด๊ฐ h์ธ ์ด์ง ํธ๋ฆฌ์ ๋
ธ๋ ๊ฐ์: ์ต์ h๊ฐ / ์ต๋ 2^h - 1๊ฐ
- ํ ๋ ๋ฒจ์ ์ ์ด๋ ํ๋์ ๋ ธ๋๊ฐ ์กด์ฌํด์ผ ํจ
- ํ๋์ ๋ ธ๋๋ ์ต๋ 2๊ฐ์ ์์์ ๊ฐ์ง ์ ์์
- ๋ ๋ฒจ i์์ ์ต๋ ๋ ธ๋ ๊ฐ์: 2^(i - 1) - n๊ฐ์ ๋
ธ๋๋ฅผ ๊ฐ์ง ์ด์ง ํธ๋ฆฌ์ ๋์ด: ์ต๋ n / ์ต์ โกlog(n + 1)โค
- ํ ๋ ๋ฒจ์ ์ ์ด๋ ํ๋์ ๋ ธ๋๊ฐ ์กด์ฌํด์ผ ํจ
- ๋์ด h์ ์ด์ง ํธ๋ฆฌ๊ฐ ๊ฐ์ง ์ ์๋ ์ต๋๊ฐ n <= 2^h - 1์์ ์๋ณ์ log๋ฅผ ์ทจํ๋ฉด โกlog(n + 1)โค <= h
<์ด์ง ํธ๋ฆฌ์ ๋ถ๋ฅ>
- ํฌํ ์ด์ง ํธ๋ฆฌ(Full Binary Tree)
- ํธ๋ฆฌ์ ๊ฐ ๋ ๋ฒจ์ ๋ ธ๋๊ฐ ๊ฝ ์ฐจ ์๋ ์ด์ง ํธ๋ฆฌ
- ๋์ด๊ฐ k์ธ ํฌํ ์ด์ง ํธ๋ฆฌ์ ๋ ธ๋ ๊ฐ์: 2^k - 1 - ์์ ์ด์ง ํธ๋ฆฌ(Complete Binary Tree)
- ๋์ด๊ฐ k์ผ ๋, ๋ ๋ฒจ 1๋ถํฐ k - 1๊น์ง๋ ๋ ธ๋๊ฐ ๋ชจ๋ ์ฑ์์ ธ ์๊ณ ๋ ๋ฒจ k์์๋ ์ผ์ชฝ๋ถํฐ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ ธ๋๊ฐ ์์๋๋ก ์ฑ์์ง ์ด์ง ํธ๋ฆฌ
- ํฌํ ์ด์ง ํธ๋ฆฌ๋ ํญ์ ์์ ์ด์ง ํธ๋ฆฌ์ด์ง๋ง ๊ทธ ์ญ์ ํญ์ ์ฑ๋ฆฝํ์ง๋ ์์
๐ก ์ด์ง ํธ๋ฆฌ์ ์ํ(Traversal)
์ด์ง ํธ๋ฆฌ์ ์ํ๋ ์ด์ง ํธ๋ฆฌ์ ์ํ๋ ๋ชจ๋ ๋ ธ๋๋ค์ ํ ๋ฒ์ฉ ๋ฐฉ๋ฌธํ์ฌ ๋ ธ๋๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ชฉ์ ์ ๋ง๊ฒ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋งํ๋ค. ์ด์ง ํธ๋ฆฌ์ ์ํ ๋ฐฉ๋ฒ์ ํฌ๊ฒ 3๊ฐ์ง๋ก ๋๋ ์ ์๋ค.
- ์ ์ ์ํ(preorder traversal): VLR
- ์ค์ ์ํ(inorder traversal): LVR
- ํ์ ์ํ(postorder traversal): LRV
<์ค์ ์ํ ์๊ณ ๋ฆฌ์ฆ>
def inorder(root):
if root:
inorder(root.left) # ์ผ์ชฝ ์๋ธ ํธ๋ฆฌ ์ํ
print(root.data) # ๋
ธ๋ ๋ฐฉ๋ฌธ
inorder(root.right) # ์ค๋ฅธ์ชฝ ์๋ธ ํธ๋ฆฌ ์ํ
์ ์ ์ํ์ ํ์ ์ํ๋ ๋น์ทํ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ๊ท์ ์ผ๋ก ๊ตฌํํ ์ ์๋ค.
์ด๋ฐ์๋ ๋ ๋ฒจ ์ํ(level order) ๋ฐฉ๋ฒ์ผ๋ก ์ด์ง ํธ๋ฆฌ๋ฅผ ์ํํ ์ ์๋ค. ๋ ๋ฒจ ์ํ๋ ๊ฐ ๋ ธ๋๋ฅผ ๋ ๋ฒจ ์์ผ๋ก ๊ฒ์ฌํ๋ ๋ฐฉ๋ฒ์ด๋ค. ๋์ผํ ๋ ๋ฒจ์ ๊ฒฝ์ฐ์๋ ์ข์์ ์ฐ๋ก ๋ฐฉ๋ฌธํ๋ค. ์ 3๊ฐ์ง ์ํ ๋ฐฉ๋ฒ์ ์คํ(์ฌ๊ท ํธ์ถ)์ ์ฌ์ฉํ์ง๋ง, ๋ ๋ฒจ ์ํ๋ ํ๋ฅผ ์ฌ์ฉํ๋ ์ํ ๋ฐฉ๋ฒ์ด๋ค.
<๋ ๋ฒจ ์ํ ์๊ณ ๋ฆฌ์ฆ>
from collections import deque
def level_order(root):
queue = deque.([root])
while queue:
root = queue.popleft()
if root:
print(root.data) # ๋
ธ๋ ๋ฐฉ๋ฌธ
if root.left:
queue.append(root.left) # ์ผ์ชฝ ์๋ธ ํธ๋ฆฌ ํ์ ์ฝ์
if root.right:
queue.append(root.right) # ์ค๋ฅธ์ชฝ ์๋ธ ํธ๋ฆฌ ํ์ ์ฝ์
์ฐธ๊ณ : ํธ๋ฆฌ๋ ๊ทธ๋ํ์ ๋ฌ๋ฆฌ ์ฌ์ดํด์ด ์๊ธฐ ๋๋ฌธ์ BFS์ ๋ฌ๋ฆฌ visited๋ฅผ ์ ์ฅํ ํ์๊ฐ ์์
๐ก ์ด์ง ํ์ ํธ๋ฆฌ(Binary Search Tree)
์ด์ง ํ์ ํธ๋ฆฌ๋ ์ด์ง ํธ๋ฆฌ ๊ธฐ๋ฐ์ ํ์์ ์ํ ์๋ฃ๊ตฌ์กฐ์ด๋ค. ์ด์ง ํ์ ํธ๋ฆฌ์ ์ ์๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ๋ชจ๋ ๋ ธ๋์ ํค๋ ์ ์ผํ๋ค
- ์ผ์ชฝ ์๋ธ ํธ๋ฆฌ์ ํค๋ค์ ๋ฃจํธ์ ํค๋ณด๋ค ์๋ค
- ์ค๋ฅธ์ชฝ ์๋ธ ํธ๋ฆฌ์ ํค๋ค์ ๋ฃจํธ์ ํค๋ณด๋ค ํฌ๋ค
- ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ ์๋ธ ํธ๋ฆฌ๋ ์ด์ง ํ์ ํธ๋ฆฌ์ด๋ค
<์ด์ง ํ์ ํธ๋ฆฌ์ search>
์ด์ง ํ์ ํธ๋ฆฌ์์ ํน์ ํค ๊ฐ์ ๊ฐ์ง ๋ ธ๋๋ฅผ ์ฐพ๊ธฐ ์ํด์๋ ๋จผ์ ์ฃผ์ด์ง ํ์ ํค ๊ฐ๊ณผ ํ์ฌ์ ๋ฃจํธ ๋ ธ๋์ ํค ๊ฐ์ ๋น๊ตํ๋ค. ๋น๊ต ๊ฒฐ๊ณผ๋ ๋ค์ 3๊ฐ์ง๋ก ๋๋์ด์ง๋ค.
- target == root: ํ์ ์ข ๋ฃ
- target < root: ๋ฃจํธ์ ์ผ์ชฝ ์์์ ๊ธฐ์ค์ผ๋ก ์ฌํ์
- target > root: ๋ฃจํธ์ ์ค๋ฅธ์ชฝ ์์์ ๊ธฐ์ค์ผ๋ก ์ฌํ์
<์ด์ง ํ์ ํธ๋ฆฌ์ insert>
- ํธ๋ฆฌ T์์ ์ฝ์ ํ ํค ๊ฐ x์ ๋ํ ํ์ ์ํ
- ํ์์ด ์คํจํ๋ฉด ํ์์ด ๋๋ ์ง์ ์ ๋ ธ๋ x ์ฝ์
์ด์ง ํ์ ํธ๋ฆฌ์ ํค ๊ฐ๋ค์ ์ ์ผํด์ผ ํ๊ธฐ ๋๋ฌธ์ x๊ฐ์ ๋ํ ํ์์ ์ฑ๊ณตํ๋ค๋ฉด x๋ฅผ ์ค๋ณต ์ฝ์ ํ์ง ๋ชปํ๋ค.
<์ด์ง ํ์ ํธ๋ฆฌ์ delete>
๋ ธ๋๋ฅผ ์ญ์ ํ๊ธฐ ์ํด์๋ ๋จผ์ ๋ ธ๋๋ฅผ ํ์ํด์ผ ํ๋ค. ๋ ธ๋๋ฅผ ํ์ํ ๋ค์, ๋ค์ 3๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํด์ผ ํ๋ค.
- ์ญ์ ํ๋ ค๋ ๋
ธ๋ x๊ฐ ๋จ๋ง ๋
ธ๋์ผ ๊ฒฝ์ฐ
- ๋จ๋ง ๋ ธ๋ x๋ง ์ญ์ - ์ญ์ ํ๋ ค๋ ๋
ธ๋ x๊ฐ ํ๋์ ์๋ธ ํธ๋ฆฌ(์ผ์ชฝ ๋๋ ์ค๋ฅธ์ชฝ)๋ฅผ ๊ฐ์ง ๊ฒฝ์ฐ
- ๋ ธ๋ x๋ ์ญ์ ํ๊ณ , ์๋ธ ํธ๋ฆฌ๋ฅผ x์ ๋ถ๋ชจ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ํจ - ์ญ์ ํ๋ ค๋ ๋
ธ๋ x๊ฐ ๋ ๊ฐ์ ์๋ธ ํธ๋ฆฌ๋ฅผ ๊ฐ์ง ๊ฒฝ์ฐ
- x๋ฅผ ์ญ์ ํ๊ณ x์ ์๋ฆฌ์ ์ผ์ชฝ ์๋ธ ํธ๋ฆฌ์์ ๊ฐ์ฅ ํฐ ๊ฐ ๋๋ ์ค๋ฅธ์ชฝ ์๋ธ ํธ๋ฆฌ์์ ๊ฐ์ฅ ์์ ๊ฐ์ ๋ฃ์
<์๊ฐ ๋ณต์ก๋>
์ด์ง ํ์ ํธ๋ฆฌ์์ ํ์, ์ฝ์ , ์ญ์ ์ฐ์ฐ์ ์๊ฐ ๋ณต์ก๋๋ ํธ๋ฆฌ์ ๋์ด๋ฅผ h๋ผ๊ณ ํ์ ๋, O(h)์ด๋ค. ๋ฐ๋ผ์ n๊ฐ์ ๋ ธ๋๋ฅผ ๊ฐ์ง๋ ์ด์ง ํ์ ํธ๋ฆฌ์ ๊ฒฝ์ฐ ๊ท ํ ์กํ ์ด์ง ํธ๋ฆฌ์ ๋์ด๋โกlog(n)โค์ด๋ฏ๋ก ํ๊ท ์ ๊ฒฝ์ฐ ์๊ฐ ๋ณต์ก๋๋ O(log(n))์ด๋ค.
ํ์ง๋ง ๋ง์ฝ ํ์ชฝ์ผ๋ก ์น์ฐ์น๋ ๊ฒฝ์ฌ์ง๋ ์ด์ง ํธ๋ฆฌ์ผ ๊ฒฝ์ฐ์๋ ํธ๋ฆฌ์ ๋์ด๊ฐ n์ด ๋๊ณ ์ด๋์ ํ์, ์ญ์ , ์ฝ์ ์๊ฐ์ O(n)์ผ๋ก ์ ํ ํ์๊ณผ ์ ์ฌํ๋ค.
Reference
- C์ธ์ด๋ก ์ฝ๊ฒ ํ์ด์ด ์๋ฃ ๊ตฌ์กฐ
- http://ejklike.github.io/2018/01/09/traversing-a-binary-tree-2.html
'CS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[OS] ์ด์์ฒด์ (Operating System)๋? (0) | 2021.10.16 |
---|---|
[OS] ํ๋ก์ธ์ค(Process) vs ์ค๋ ๋(Thread) (0) | 2021.10.12 |
[์๋ฃ๊ตฌ์กฐ] ํ(heap) ์๋ฃ๊ตฌ์กฐ (1) | 2021.09.30 |
[WEB] HTTP ์ํ ์ฝ๋ (0) | 2021.09.28 |
[Network] CIDR(์ฌ์ด๋)์ด๋? CIDR ๊ธฐ๋ณธ ๊ฐ๋ (0) | 2021.04.24 |