Tree์ ๊ตฌ์กฐ, ์ ์ ๋ฐ ์ฉ์ด
Binary Tree
Binary Tree์ ํน์ง
ํธ๋ฆฌ๋ ๋ ธ๋๋ก ์ด๋ฃจ์ด์ง ๋น์ ํ์ ๊ตฌ์กฐ์ด๋ค. ํธ๋ฆฌ๊ฐ ๋๊ธฐ์ํด์๋
- ์์์ ๋ ธ๋์์ ๋ค๋ฅธ ๋ ธ๋๋ก ๊ฐ๋ ๊ฒฝ๋ก๋ ์ ์ผํ๋ค.
- ์ฌ์ดํด(ํ๋ก)๊ฐ ์กด์ฌํ์ง ์๋๋ค.
- ๋ชจ๋ ๋ ธ๋๋ ์๋ก ์ฐ๊ฒฐ๋์ด ์๋ค.
- edge:๊ฐ์ ์ ํ๋ ์๋ฅด๋ฉด ํธ๋ฆฌ๊ฐ ๋๊ฐ๋ก ๋ถ๋ฆฌ๋๋ค.
- ๊ฐ์ ์ ์|E|๋ |V|์์ 1์ ๋บ ๊ฒ๊ณผ ๊ฐ๋ค.
๐ ์ฌ์ดํด์ด ์กด์ฌํจ.
๐ ์ฌ์ดํด ์กด์ฌํ์ง ์์ง๋ง 1์์ 4๋ก ๊ฐ๋ ๊ฒฝ๋ก ์ ์ผํ์ง ์์
๐ ์ฐ๊ฒฐ๋์ง ์์ ๋ ธ๋๊ฐ ์กด์ฌ.
-
๋ฃจํธ ๋ ธ๋ :๋ถ๋ชจ๊ฐ ์๋ ๋ ธ๋, ํธ๋ฆฌ๋ ํ๋์ ๋ฃจํธ๋ ธ๋ ๋ง์ ๊ฐ์ง๋ค.
-
๋จ๋ง ๋ ธ๋ :์์์ด ์๋ ๋ ธ๋. '๋ง๋จ ๋ ธ๋(terminal)', '์ ๋ ธ๋(leaf)'
-
๋ด๋ถ ๋ ธ๋ :๋จ๋ง ๋ ธ๋๊ฐ ์๋ ๋ ธ๋
-
๋ถ๋ชจ ๋ ธ๋ : ๋ฃจํธ ๋ ธ๋ ๋ฐฉํฅ์ผ๋ก ์ง์ ์ฐ๊ฒฐ๋ ๋ ธ๋
-
ํ์ ๋ ธ๋:๊ฐ์ ๋ถ๋ชจ๋ฅผ ๊ฐ์ง๋ ๋ ธ๋
-
์์ ๋ ธ๋ :๋กํธ ๋ ธ๋ ๋ฐ๋๋ฐฉํฅ์ผ๋ก ์ง์ ์ฐ๊ฒฐ๋ ๋ ธ๋
-
๊ฐ์ :๋ ธ๋๋ฅผ ์ฐ๊ฒฐํ๋ ์
- ๋ ธ๋์ ํฌ๊ธฐ :์์ ์ ํฌํจํ ๋ชจ๋ ์์ ๋ ธ๋์ ๊ฐ์
- ๊น์ด :๋ฃจํธ์์ ์ด๋ค ๋ ธ๋์ ๋๋ฌํ๊ธฐ ์ํด ๊ฑฐ์ณ์ผํ๋ ๊ฐ์ ์ ์
- ๋ ๋ฒจ :ํธ๋ฆฌ์ ํน์ ๊น์ด๋ฅผ ๊ฐ์ง๋ ๋ ธ๋์ ์งํฉ
- ์ฐจ์ :๊ฐ ๋ ธ๋๊ฐ ์ง๋ ์์์ ์
- ํธ๋ฆฌ์ ์ฐจ์ :ํธ๋ฆฌ์ ์ต๋ ์ฐจ์ (max(deg1, deg2, deg3))
- ํธ๋ฆฌ์ ๋์ด :๋ฃจํธ ๋
ธ๋์์ ๊ฐ์ฅ ๊น์ํ ์๋ ๋
ธ๋์ ๊น์ด
์ด์งํธ๋ฆฌ๋ ์์ ๋ ธ๋๊ฐ ์ต๋ ๋ ๊ฐ์ ๋ ธ๋๋ค๋ก ๊ตฌ์ฑ๋ ํธ๋ฆฌ์ด๋ค.
- ์ ์ด์งํธ๋ฆฌ(full binary tree)
- ์์ ์ด์งํธ๋ฆฌ(complete binary tree)
- ๊ท ํ ์ด์งํธ๋ฆฌ(balanced binary tree)
- ์ ์ด์งํธ๋ฆฌ๋ ์์๋
ธ๋๋ฅผ ์ ์ธํ ๋ชจ๋ ๋
ธ๋๊ฐ ์์๋
ธ๋๋ฅผ
2๊ฐ ๋๋ 0๊ฐ
๊ฐ์ง - ์ ์ด์งํธ๋ฆฌ์์ ๋ ๋ฒจ์ ๋ฐ๋ฅธ ๋ ธ๋์ ์ซ์๋ ์๋ ํ์ ๊ฐ๋ค.
๋ ๋ฒจ | ๋ ธ๋์ |
---|---|
0 | 2^0 |
1 | 2^1 |
3 | 2^2 |
3 | 2^3 |
k | 2^k |
- ์์ ์ด์ง ํธ๋ฆฌ๋
๋ง์ง๋ง ๋ ๋ฒจ์ ์ ์ธํ ๋ชจ๋ ๋ ๋ฒจ์์ ๋ ธ๋๋ค์ด ๊ฝ ์ฑ์์ง ์ด์งํธ๋ฆฌ
- ๋ฐ์ดํฐ๊ฐ
์ผ์ชฝ ๋จ๋ง ๋ ธ๋
๋ถํฐ ์ฑ์์ ธ์ผ ํ๋ค. - ์์ ์ด์ง ํธ๋ฆฌ๋ 1์ฐจ์ ๋ฐฐ์ด๋ก๋ ํํ์ด ๊ฐ๋ฅํ๋ค.
- ๋ชจ๋ ์์ ๋ ธ๋์ ๊น์ด ์ฐจ์ด๊ฐ ์ต๋ 1์ธ ํธ๋ฆฌ
- ๊ท ํ ์ด์ง ํธ๋ฆฌ๋ ์์ธก ๊ฐ๋ฅํ ๊น์ด๋ฅผ ๊ฐ์ง๋ฉฐ, ๋ ธ๋๊ฐ n๊ฐ์ธ ๊ท ํ ์ด์ง ํธ๋ฆฌ์ ๊น์ด๋ log n์ ๋ด๋ฆผํ ๊ฐ์ ๊ฐ์ง๋ค.
- ํ ์ ๋ ฌ๊ณผ ์ด์ง ํ์ ํธ๋ฆฌ๋ ๋ชจ๋ ์ด์ง ํธ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ง ๊ธฐ๋ฒ์ด๋ค.
class Node:
def __init__(self, data):
self.data = data
self.left = None
self.right = None
def __str__(self):
return str(self.data)
class Tree:
def __init__(self):
self.root = None
์์ ์ ๊ธฐ์ค์ผ๋ก ์ถ๋ ฅ ์์๋ฅผ ์๊ฐํ๋ฉด ์ฝ๋ค. ์ ์๋ ์์ ๋จผ์ , ์ค์๋ ๋ด๊ฐ ์ค๊ฐ ์์, ํ์๋ ๋ด๊ฐ ๋ง์ง๋ง ์์์.
- ์ ์ ์ํ
def preorder(self, node):
print(node, end = '')
if not node.left == None : self.preorder(node.left)
if not node.right == None : self.preorder(node.right)
- ์ค์ ์ํ
def inorder(self, node):
if not node.left == None : self.preorder(node.left)
print(node, end = '')
if not node.right == None : self.preorder(node.right)
- ํ์ ์ํ
def preorder(self, node):
if not node.left == None : self.preorder(node.left)
if not node.right == None : self.preorder(node.right)
print(node, end = '')
- ์ด์ง ํ์ ํธ๋ฆฌ๋ฅผ ์ค์ ์ํ๋ฅผ ํ๋ฉด ์ ๋ ฌ๋ ๊ฒฐ๊ด๋ฅด ์ป์ ์ ์๋ค.
- ์ด์ง ํธ๋ฆฌ์ ์ผ์ข ์ผ๋ก ๋ ธ๋ ์ผ์ชฝ์ ์๊ธฐ ์์ ๋ณด๋ค ์์ ๊ฐ๋ง ๊ฐ์ง๊ณ , ์ค๋ฅธ์ชฝ์ ์๊ธฐ ์์ ๋ณด๋ค ํฐ ๊ฐ๋ง์ ๊ฐ์ง๋ค.
- ์ด๋ ๊ฒ ๊ตฌ์ฑํ๋ฉด ์ด๋ค ๊ฐ n์ ์ฐพ์ ๋, ๋ฃจํธ ๋ ธ๋์ ๋น๊ตํด์ n์ด ๋ ์๋ค๋ฉด ์ค๋ฅธ์ชฝ ํธ๋ฆฌ๋ฅผ ํ์ํ ํ์๊ฐ ์๋ค.
- ์ด์์ ์ธ ์ํฉ์์ ํ์/์ฝ์
/์ญ์ ๋ชจ๋ ์๊ฐ ๋ณต์ก๋๊ฐ O(logn)์ด๋ค.
์ด์์ ์ธ ์ํฉ = ๊ท ํ์ก์ธ ์ด์ง ํธ๋ฆฌ
- BST์ Binary tree์ ๋ํด์ ์ค๋ช ํ์์ค.
- ์ค์ ์ํ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์์ค.
- full binary tree์ complete binary ํธ๋ฆฌ์ ํน์ง์ ๋งํ์์ค.
- ํธ๋ฆฌ์ ์ ์(์ฑ์ง) ์ต์ 3๊ฐ์ง๋ฅผ ๋งํ์์ค.