ํธ๋ฆฌ (Tree)
ํธ๋ฆฌ (Tree)๋ ๋ ธ๋๋ค์ด ๋๋ฌด ๊ฐ์ง์ฒ๋ผ ์ฐ๊ฒฐ๋ ๋น์ ํ ๊ณ์ธต์ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
ํธ๋ฆฌ๋ ํธ๋ฆฌ ๋ด์ ๋ค๋ฅธ ํ์ ํธ๋ฆฌ๊ฐ ์๊ณ ๊ทธ ํ์ ํธ๋ฆฌ ์์๋ ๋ ๋ค๋ฅธ ํ์ ํธ๋ฆฌ๊ฐ ์๋ ์ฌ๊ท์ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
ํธ๋ฆฌ (Tree)์์ ์ฌ์ฉํ๋ ์ฉ์ด
- ๋ ธ๋ (Node)
ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๊ณ ์๋ ๊ธฐ๋ณธ ์์
- ๊ฐ์ (Edge)
๋ ธ๋์ ๋ ธ๋ ๊ฐ์ ์ฐ๊ฒฐ์
- ๋ฃจํธ๋ ธ๋ (Root Node)
ํธ๋ฆฌ ๊ตฌ์กฐ์์ ๋ถ๋ชจ๊ฐ ์๋ ์ต์์ ๋ ธ๋
- ๋ถ๋ชจ๋ ธ๋ (Parent Node)
์์ ๋ ธ๋๋ฅผ ๊ฐ์ง ๋ ธ๋
- ์์๋ ธ๋ (Child Node)
๋ถ๋ชจ ๋ ธ๋์ ํ์ ๋ ธ๋
- ํ์ ๋ ธ๋ (Sibling Node)
๊ฐ์ ๋ถ๋ชจ๋ฅผ ๊ฐ์ง๋ ๋ ธ๋
- ์ธ๋ถ ๋ ธ๋(external node, outer node), ๋จ๋ง ๋ ธ๋ (terminal node), ๋ฆฌํ ๋ ธ๋(leaf node)
์์ ๋ ธ๋๊ฐ ์๋ ๋ ธ๋
- ๋ด๋ถ ๋ ธ๋ (internal node, inner node), ๋น ๋จ๋ง ๋ ธ๋ (non-terminal node), ๊ฐ์ง ๋ ธ๋ (branch node)
์์ ๋ ธ๋ ํ๋ ์ด์ ๊ฐ์ง ๋ ธ๋
- ๋์ด (height)
์ด๋ค ๋ ธ๋์์ ๋ฆฌํ ๋ ธ๋๊น์ง ๊ฐ์ฅ ๊ธด ๊ฒฝ๋ก์ ๊ฐ์ (Edge) ์
- ๊น์ด (depth)
๋ฃจํธ์์ ์ด๋ค ๋ ธ๋๊น์ง์ ๊ฐ์ (Edge) ์
ํธ๋ฆฌ์ ํน์ง
1. ํ๋์ ๋ฃจํธ ๋ ธ๋์ 0๊ฐ ์ด์์ ํ์ ํธ๋ฆฌ๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
2. ๋ฐ์ดํฐ๋ฅผ ์์ฐจ์ ์ผ๋ก ์ ์ฅํ์ง ์๊ธฐ ๋๋ฌธ์ ๋น์ ํ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
3. ํธ๋ฆฌ ๋ด์ ๋ ๋ค๋ฅธ ํธ๋ฆฌ๊ฐ ์๋ ์ฌ๊ท์ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
4. ๋จ์ ์ํ์ ๊ฐ์ง ์๊ณ , ์ฐ๊ฒฐ๋ ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ ๊ตฌ์กฐ์ด๋ค.
5. ๋ ธ๋ ๊ฐ์ ๋ถ๋ชจ ์์ ๊ด๊ณ๋ฅผ ๊ฐ๊ณ ์๋ ๊ณ์ธตํ ์๋ฃ๊ตฌ์กฐ์ด๋ฉฐ ๋ชจ๋ ์์ ๋ ธ๋๋ ํ๋์ ๋ถ๋ชจ ๋ ธ๋๋ง ๊ฐ๋๋ค.
6. ๋ ธ๋๊ฐ n๊ฐ์ธ ํธ๋ฆฌ๋ ํญ์ n-1๊ฐ์ ๊ฐ์ (edge)์ ๊ฐ์ง๋ค.
ํธ๋ฆฌ์ ์ข ๋ฅ
- ํธํฅ ํธ๋ฆฌ
๋ชจ๋ ๋ ธ๋๋ค์ด ์์์ ํ๋๋ง ๊ฐ์ง ํธ๋ฆฌ
- ์ด์ง ํธ๋ฆฌ
๊ฐ ๋ ธ๋์ ์ฐจ์(์์ ๋ ธ๋)๊ฐ 2 ์ดํ์ธ ํธ๋ฆฌ
- ์ด์ง ํ์ ํธ๋ฆฌ
์์ํ๋ ์ด์ง ํธ๋ฆฌ
๋ ธ๋์ ์ผ์ชฝ ์์์ ๋ถ๋ชจ์ ๊ฐ๋ณด๋ค ์์ ๊ฐ์ ๊ฐ์ ธ์ผ ํ๋ฉฐ ๋ ธ๋์ ์ค๋ฅธ์ชฝ ์์์ ๋ถ๋ชจ์ ๊ฐ๋ณด๋ค ํฐ ๊ฐ์ ๊ฐ์ ธ์ผ ํ๋ค.
- ๊ท ํ ํธ๋ฆฌ
๋์ด ๊ท ํ์ ์ ์งํ๋ ํธ๋ฆฌ
Python์ผ๋ก ๊ตฌํํ ์ฝ๋
class Node:
def __init__(self,value):#์ด์งํธ๋ฆฌ์ด๋ฏ๋ก left์ right๋ง ์์ด๋ ๋จ
self.value = value
self.left = None
self.right = None
class NodeMgmt:
def __init__(self,head): #root๋
ธ๋๊ฐ head
self.head=head
# ์ฝ์
ํจ์
def insert(self,value):
self.current_node = self.head #ํ์ฌ ๋
ธ๋๋ head๋ก ์ก์
while True: #recursive
if value < self.current_node.value:
if self.current_node.left != None:
self.current_node = self.current_node.left
else:
self.current_node.left = Node(value)
break
else:
if self.current_node.right != None:
self.current_node = self.current_node.right
else:
self.current_node.right = Node(value)
break
# ๊ฒ์ ํฉ์
def search(self, value):
self.current_node = self.head #ํ์ฌ ๋
ธ๋๋ head๋ก ์ก์
while self.current_node:
if self.current_node.value == value:
return True
break
elif value < self.current_node.value:
self.current_node = self.current_node.left
else:
self.current_node = self.current_node.right
return False
# ์ญ์ ํจ์
def delete(self, value):
searched = False
self.current_node = self.head
self.parent = self.head
# ์ญ์ ํ๊ณ ์ ํ๋ value๋ฅผ ๊ฐ์ง๊ณ ์๋ ๋
ธ๋๋ฅผ ํ์ํ์ฌ current_node๋ก ์ค์
while self.current_node:
if self.current_node.value == value:
searched = True
break
elif value < current_node.value:
self.parent = self.current_node
self.current_node = self.current_node.left
else:
self.parent = self.current_node
self.current_node = self.current_node.right
if searched == False:
return False
if self.current_node.left == None and self.current_node.right==None:
if value<self.parent.value:
self.parent.left = None
else:
self.parent.right = None
del self.current_node
# ์ผ์ชฝ ์์ ๋
ธ๋๋ง ์์ ๋
if self.current_node.left != None and self.current_node.right==None:
if vale<self.parent.value:
self.parent.left = self.current_node.left
else:
self.parent.right = self.current_node.left
#์ค๋ฅธ์ชฝ ์์ ๋
ธ๋๋ง ์์ ๋
elif self.current_node.left == None and self.current_node.right!=None:
if value<self.parent.value:
self.parent.left = self.current_node.right
else:
self.parent.right = self.current_node.right
#child๊ฐ ๋ ๊ฐ ์์ ๋
if self.current_node.left != None and self.current_node.right != None:
if value<self.parent.value: #3-1
self.change_node = self.current_node.right
self.change_node_parent = self.current_node.right
while self.change_node.left != None:
self.change_node.parent = self.change_node
self.change_node = self.change_node.left
if self.change_node.right != None: #3-1-2
self.change_node_parent.left = self.change_node.right
else:
self.change_node_parent.left = None
self.parent.left = self.change_node
self.change_node.right = self.current_node.right
self.change_node.left = self.change_node.left
else:
self.change_node = self.current_node.right
self.change_node_parent = self.current_node.right
while self.change_node.left != None:
self.change_node_parent = self.change_node
self.change_node = self.change_node.left
if self.change_node.right != None:
self.change_node_parent.left = self.change_node.right
else:
self.change_node_parent.left = None
self.parent.right = self.change_node
self.change_node.left = self.current_node.left
self.change_node.right = self.current_node.right