2021. 8. 29. 08:00ใ์ฝ๋ฉ ํ ์คํธ ์ค๋น/์๋ฃ๊ตฌ์กฐ
์๋ ํ์ธ์? ์ฃผ๋ํ๋ ์ ๋๋ค.
์ค๋์ ์๋ฃ๊ตฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ์ ์๋ฃ๊ตฌ์กฐ์์ Tree ๊ตฌ์กฐ์ ๋ํด ๊ณต๋ถ ํด ๋ณด๋๋ก ํ๋ ๊ฒ์ด์์.
๋ํ๊ต ๊ฐ์ ์๊ฐ์ ์ฐธ ์ดํด๊ฐ ์ ๊ฐ๋ ๊ฒ๋ค ์ค ํ๋์๋๋ฐ, ๋ค์ ํ๋ฒ ๊ณต๋ถ ํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์์ค ์ฝ๋์ ๋ํด์ ํ์ธ ํ๊ณ ์ถ์ผ์ ๋ถ๋ค๊ป์๋ ์ฃผ๋ํ๋์ Git hub์ ๊ด์ฌ์ ์ฃผ์ธ์!
๐ Tree ๊ตฌ์กฐ
Tree๋ Node์ Branch๋ฅผ ์ด์ฉํ์ฌ Cycle์ด ์ด๋ค์ง์ง ์๋๋ก ๊ตฌ์ฑํ Data ๊ตฌ์กฐ์ธ ๊ฒ์ด์์.
Git์ ์ฌ์ฉํด ๋ณด์ จ๋ค๋ฉด Branch ๋ง์ด ๋ค์ด๋ณด์ จ์ง์?
๊ทธ๋ ๋ค๋ฉด ์ด๋์ ๋ง์ด ์ฌ์ฉ๋ ๊น์? Tree ๊ตฌ์กฐ ์ค Binary Tree(์ด์ง ํธ๋ฆฌ) ํํ์ ๊ตฌ์กฐ๋ก, ํ์(๊ฒ์) ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ์ ์ํด ๋ง์ด ์ฌ์ฉ๋๋ต๋๋ค!
๐ ์ฉ์ด ์ ๋ฆฌ
- Node : Tree์์ ์ค์ง์ ์ผ๋ก Data๋ฅผ ์ ์ฅํ๊ณ ์๋ ๊ณณ. ๋๋ Data๋ฅผ ์ ์ฅํ๋ ๊ธฐ๋ณธ ์์ (Data์ ๋ค๋ฅธ Node์ ๋ํ Branch ์ ๋ณด ํฌํจ)
- Root Node: Tree ์ต์๋จ์ ์์นํ Node
- Level : Tree ์ต์๋จ Node๋ฅผ Level 0์ด๋ผ๊ณ ๊ฐ์ ํ์ ๋, ํ์ Branch๋ก ์ฐ๊ฒฐ๋ Node์ Depth(๊น์ด)
- Parent Node : ์ด๋ค Node์ ๋ค์ ํ์ Level์ ์ฐ๊ฒฐ๋ Node
- Child Node : ์ด๋ค Node์ ์ด์ ์์ Level์ ์ฐ๊ฒฐ๋ Node
- Leaf Node (Terminal Node) : Child Node๊ฐ ํ๋๋ ์๋ Node
- Sibling (Brother Node) : ๋์ผํ Parent Node(๋ถ๋ชจ Node)๋ฅผ ๊ฐ์ง Node๋ค์ ์ง์นญ
- Depth : Tree์์ Node๊ฐ ๊ฐ์ง ์ ์๋ ์ต๋ Level(๊น์ด)
์์ ๊ทธ๋ฆผ์์ Node์ Node๋ฅผ ์ฐ๊ฒฐ ํด ์ฃผ๋ ์ ์ Branch๋ผ๊ณ ํ๋ ๊ฒ์ด์์. ๋ค๋ง, ํ๋ ์์์ผ ํ ๊ฒ์ Branch๋ ๋ถ๋ชจ์ ์์ ๊ฐ์๋ง ์ฐ๊ฒฐ์ด ๊ฐ๋ฅํ๊ณ , Siblings ๊ฐ์๋ ์ฐ๊ฒฐํ์ง ์๋๋ต๋๋ค. ๋ง์ฝ Node 5, 3, 6์ด ์๋ก Branch๋ก ์ฐ๊ฒฐ ๋์๋ค๋ฉด Cycle์ด ํ์ฑ์ด ๋์์ํ ๋ฐ, 3๊ณผ 6์ Siblings๋ก ์๋ก Branch๋ก ์ฐ๊ฒฐํ์ง ๋ชปํ๋ค๋ณด๋ Cycle์ด ํ์ฑ๋ ์ ์๋ ๊ฒ์ด์์.
๐ Binary Tree And Binary Search Tree (์ด์ง ํธ๋ฆฌ์ ์ด์ง ํ์ ํธ๋ฆฌ)
์ด์ง ํธ๋ฆฌ๋ Node์ ์ต๋ Branch๊ฐ 2์ธ ๊ฒ์ ๋ํ๋ด๋ ๊ฒ์ด์์.
Binary Search Tree, BST (์ด์ง ํ์ ํธ๋ฆฌ)๋ ๋ค์๊ณผ ๊ฐ์ ์กฐ๊ฑด์ด ๋ถ๋ ๊ฒ์ ์ด์ผ๊ธฐ ํด์!
- ์ผ์ชฝ Node๋ ์๋จ Node๋ณด๋ค ์์ ๊ฐ์ ๊ฐ์ผ๋ฉฐ, ์ค๋ฅธ์ชฝ Node๋ ์๋จ Node๋ณด๋ค ํฐ ๊ฐ์ ๊ฐ๋๋ค.
๐ Binary Tree And Sorted Array Search(์ด์ง ํธ๋ฆฌ์ ์ ๋ ฌ๋ ๋ฐฐ์ด๊ฐ์ ํ์ ๋น๊ต)
์์ ๊ฐ์ ์ 27์ด๋ผ๋ Data๋ฅผ ์ฐพ๋ ๊ฒ์ด์์. ๋จผ์ ์ด์ง ํ์ ํธ๋ฆฌ์์๋ 21๋ณด๋ค 27์ด ํฌ๊ธฐ ๋๋ฌธ์ ์ค๋ฅธ์ชฝ์์ ๊ฐ์ ์ฐพ์ผ๋ ค๊ณ ํฉ๋๋ค.
์๋ํ๋ฉด? ์ด์ง ํ์ ํธ๋ฆฌ๋ ์๋จ Node์ ๊ฐ๋ณด๋ค ์์ผ๋ฉด ์ผ์ชฝ์ ํฌ๋ฉด ์ค๋ฅธ์ชฝ์ ๊ทธ Data๋ฅผ ์์น ์ํค๋ ์ฑ์ง์ด ์๊ธฐ ๋๋ฌธ์ธ ๊ฒ์ด์์.
์ด๋ฅผ ํตํด 28์ ์๋ฆฌ๋ก ํ๊ฒ ๋๊ณ , 27์ 28๋ณด๋ค ์๊ธฐ ๋๋ฌธ์ 25์ ์๋ฆฌ๋ก ๊ฐ ๊ฒ์ด์์. 27์ 25๋ณด๋ค ํฌ๊ธฐ ๋๋ฌธ์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ํ๊ฒ ๋ ๊ฒ์ด๊ณ , ๋น๋ก์ 27์ ์ฐพ๊ฒ ๋๋ ๊ฒ์ด์์.
์ด์ง ํ์ ํธ๋ฆฌ๋ก 27์ด๋ผ๋ Data๋ฅผ ์ฐพ๋๋ฐ, ์ด 3๋ฒ์ ํ์์ด ์ด๋ค์ก์ด์!
๊ทธ๋ ๋ค๋ฉด ๋ฐฐ์ด์ ์ด๋จ๊น์? ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ ๋ฐฐ์ด์์ 27์ ์ฐพ๊ธฐ ์ํด ์์ gif์์ ๋ณด๋ ๊ฒ๊ณผ ๊ฐ์ด ์ด 10๋ฒ์ ํ์์ด ์ด๋ค์ก์ต๋๋ค.
๋์ ๋น๊ตํ๋ฉด ํ์ ์๋ ์ฐจ์ด๊ฐ ๋ง์ด ๋๊ฒ ์ง์?
๐ Binary Search Tree Node Delete (์ด์ง ํ์ ํธ๋ฆฌ ๋ ธ๋ ์ญ์ )
์ด๊ฒ์ ๋งค์ฐ ๋ณต์กํ ๊ฒ์ด์์. ๋๋ฌธ์ ์ฐ๋ฆฌ๋ 3๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ๋๋์ด์ ์์๋ณผ ๊ฒ์ด์์!
๐ Leaf Node : Child Node๊ฐ ์๋ Node๋ฅผ ์ญ์ ํ ๋
์ด ๋๋ ์ญ์ ํ Node์ Parent Node(๋ถ๋ชจ ๋ ธ๋)๊ฐ ์ญ์ ํ Node๋ฅผ Branch๋ก ๊ฐ๋ฅดํค์ง ์๋๋ก ํด์ผ ํ๋ ๊ฒ์ด์์.
19๋ผ๋ Data๊ฐ ๋ค์ด์๋ Node๋ฅผ ์ญ์ ํ๋ ค๊ณ ํ ๋๋ ๋ณ ๋ค๋ฅธ ๊ฒ ์์ด 15๋ผ๋ Node๊ฐ ํ์ฌ๋ 19๋ฅผ Branch๋ก ๊ฐ๋ฅดํค๊ณ ์๋๋ฐ, ์ด๊ฒ์ None(Python ๋ฑ), Null(Java ๋ฑ)์ผ๋ก ๋ณ๊ฒฝํ์ฌ Child Node๊ฐ ์๋ค๊ณ ์ค์ ์ ํด ์ฃผ๋ฉด ๋๋ ๊ฒ์ด์์.
๐ Child Node๊ฐ ํ๋์ธ Node ์ญ์
์ด ๋๋ ์ญ์ ํ Node์ Parent Node๊ฐ ์ญ์ ํ Node์ Child Node๋ฅผ ๊ฐ๋ฅดํค๊ฒ ๋ง๋ค์ด ์ฃผ๋ฉด ๋๋ ๊ฒ์ด์์.
15๋ผ๋ Data๊ฐ ์๋ Node๋ฅผ ์ญ์ ๋ง ํ๊ฒ ๋๋ฉด 19๋ผ๋ Node๋ ์ฐ๊ฒฐ์ด ๋์ง ์๊ฒ ๋๋ ๊ฒ์ด์์.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ 15์ Paren Node์ 15์ ์๋ ์ฐ๊ฒฐ ๋์ด ์์๋ Child Node๋ฅผ Branch๋ก ์ฐ๊ฒฐ ํด ์ฃผ๋ฉด ๋๊ฒ ์ง์?
๐ Child Node๊ฐ ๋ ๊ฐ์ธ Node ์ญ์
์ด ๋๋ ์ด ๋๊ฐ์ง๋ฅผ ๊ผญ ๊ธฐ์ตํด์ผ ํ๋ ๊ฒ์ด์์.
- ์ญ์ ํ Node์ ์ค๋ฅธ์ชฝ ์์ Node ์ค ๊ฐ์ฅ ์์ ๊ฐ(ํด๋น Node์ ๊ณ์ ์ผ์ชฝ์ผ๋ก ๋ด๋ ค๊ฐ)์ ์ญ์ ํ Node์ ์๋ฆฌ์ ์์น์ํจ๋ค.
(์ฆ, ์ญ์ ํ Node์ Parent Node๊ฐ ๊ฐ๋ฅดํค๋๋ก ํ๋ค.) - ์ญ์ ํ Node์ ์ผ์ชฝ ์์ Node ์ค ๊ฐ์ฅ ํฐ ๊ฐ(ํด๋น Node์ ๊ณ์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ด๋ ค๊ฐ)์ ์ญ์ ํ Node์ ์๋ฆฌ์ ์์น์ํจ๋ค.
(์ฆ, ์ญ์ ํ Node์ Parent Node๊ฐ ๊ฐ๋ฅดํค๋๋ก ํ๋ค.
์์ ๊ทธ๋ฆผ์์ 5๋ผ๋ Data๊ฐ ๋ค์ด์๋ Node๋ฅผ ์ญ์ ํ๋ ค๋ฉด ํด๋น ์์ ์ค ์ค๋ฅธ์ชฝ์ ์ ํํด์ ๊ทธ ๊ฐ์ ์ ์ผ ์์ ๊ฐ์ด ๋ด๊ธด Node๋ฅผ ํ์ฌ 5 ์์น์ ๋๋ฉด ๋๋ ๊ฒ์ด์์. ์์ ๊ทธ๋ฆผ์ 6๋ฐ์ ์์ผ๋๊น 6์ ์์น์ํค๋ฉด ๋๊ฒ ๋ค์!
์ด๋ ๊ฒ ์ญ์ ๋ฅผ ํ๋ค๊ณ ํ์ ๋, ๊ทธ ๋ด์ฉ์ ์ ์ด๋ณด๋ฉด ์ด๋จ๊น์?
- ์ญ์ ํ Node์ ์ค๋ฅธ์ชฝ ์์ ์ ํ
- ์ค๋ฅธ์ชฝ ์์์ ๊ฐ์ฅ ์ผ์ชฝ์ ์๋ Node ์ ํ
- ํด๋น Node๋ฅผ ์ญ์ ํ Node์ Parent Node์ ์ผ์ชฝ Branch๊ฐ ๊ฐ๋ฅดํค๊ฒ ํ๋ค.
- ํด๋น Node์ ์ผ์ชฝ Branch๊ฐ ์ญ์ ํ Node์ ์ผ์ชฝ Child Node๋ฅผ ๊ฐ๋ฅดํค๊ฒ ํ๋ค.
- ํด๋น Node์ ์ค๋ฅธ์ชฝ Branch๊ฐ ์ญ์ ํ Node์ ์ค๋ฅธ์ชฝ Child Node๋ฅผ ๊ฐ๋ฅดํค๊ฒ ํ๋ค.
- ๋ง์ฝ ํด๋น Node๊ฐ ์ค๋ฅธ์ชฝ Child Node๋ฅผ ๊ฐ์ง๊ณ ์์์ ๊ฒฝ์ฐ, ํด๋น Node์ ๋ณธ๋ Parent Node์ ์ผ์ชฝ Branch๊ฐ ์ค๋ฅธ์ชฝ Child๋ฅผ ๊ฐ๋ฅดํค๊ฒ ํ๋ค.
๐ Binary Search Tree Delete Code
์ญ์ ํ Node๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ์ฐ์ฐ์ด ์ฒ๋ฆฌ๋์ผ ํ๋ค.
์ด๋ฅผ ์ํด ์ญ์ ํ Node๊ฐ ์๋ ๊ฒฝ์ฐ False๋ฅผ ๋ฐํํ๊ณ , ํจ์๋ฅผ ์ข ๋ฃํ๋ค.
def delete(self, value):
searched = False # Tree๋ฅผ ์ํํ๋ฉด์ ํด๋น ๊ฐ์ด ์๋์ง ์ฐพ์ ๋ ์ฌ์ฉํ๋ ๋ณ์ ์ ์ธ
self.current_node = self.head # ์ญ์ ํ Node๋ฅผ ์ง์นญ
self.parent = self.head # ์ญ์ ํ Node์ ๋ถ๋ชจ๋ฅผ ์ง
while self.current_node: # ์ญ์ ํ Node๊ฐ ๊ฐ์ด ์๋ค๋ฉด ๋ฐ๋ณต
if self.current_node.value == value: # ์ญ์ ํ Node์ Data๊ฐ ์
๋ ฅ๊ฐ๊ณผ ๊ฐ๋ค๋ฉด?
searched = True # ํด๋น ๊ฐ์ด ์๊ธฐ์ True๋ก ๋ณ๊ฒฝ
break # while ๋ฌธ์ ๋๋ธ๋ค.
elif value < self.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
# == ์ดํ๋ถํฐ ์ญ์ Case์ ๋ง์ถ์ด Code ์์ฑ == #
๐ Case 1 : ์ญ์ ํ Node๊ฐ Leaf Node์ธ ๊ฒฝ์ฐ
# Leaf Node์ธ ๊ฒฝ์ฐ ์ญ์ Case
# self.current_node๊ฐ ์ญ์ ํ Node์ด๊ณ , self.parent Node๋ ์ญ์ ํ Node์ Parent Node
if self.current_node.left == None and self.current_node.right == None:
if value < self.parent.value:
self.parent.left = None
else:
self.current_node.right = Node
del self.current_node
๐ Case 2 : ์ญ์ ํ Node๊ฐ Child Node๋ฅผ ํ ๊ฐ ๊ฐ์ง๊ณ ์์ ๊ฒฝ์ฐ
# ์ญ์ ํ Node๊ฐ Parent ๊ธฐ์ค ์ผ์ชฝ์ ์์ ๋
if self.current_node.left != None and self.current_node.right == None: # ์ญ์ ํ Node์ ์ผ์ชฝ ์์ Node๊ฐ None์ด ์๋๊ณ , ์ค๋ฅธ์ชฝ ์์ Node๋ None ์ด๋ผ๋ฉด?
if value < self.parent.value: # ์ญ์ ํ ๊ฐ์ด ๋ถ๋ชจ Node์ ๊ฐ๋ณด๋ค ์๋ค๋ฉด?
self.parent.left = self.current_node.left # ๋ถ๋ชจ Node์ ์ผ์ชฝ ์์ Node์ ์ญ์ ํ Node์ ์ผ์ชฝ ์์ Node๋ฅผ ๋ฃ์์ผ๋ก ๊ฐ๋ฅดํค๊ฒ ํ๋ค.
else: # ์ญ์ ํ ๊ฐ์ด ๋ถ๋ชจ Node์ ๊ฐ๋ณด๋ค ํฌ๋ค๋ฉด?
self.parent.right = self.current_node.left # ๋ถ๋ชจ Node์ ์ค๋ฅธ์ชฝ ์์ Node์ ์ญ์ ํ Node์ ์ผ์ชฝ ์์ Node๋ฅผ ๋ฃ์์ผ๋ก ๊ฐ๋ฅดํค๊ฒ ํ๋ค.
# ์ญ์ ํ Node๊ฐ Parent ๊ธฐ์ค ์ค๋ฅธ์ชฝ์ ์์ ๋
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
์ฃผ๋ํ๋์ ๊ธ์ด ๋ง์์ ๋์
จ๋์? ๊ตฌ๋
๊ณผ ๊ณต๊ฐ! ๊ทธ๋ฆฌ๊ณ , ๋๊ธ์ ์ฃผ๋ํ๋์๊ฒ ๋ง์ ํ์ด ๋ฉ๋๋ค
'์ฝ๋ฉ ํ ์คํธ ์ค๋น > ์๋ฃ๊ตฌ์กฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๋ฃ๊ตฌ์กฐ] Heap (2) (0) | 2021.09.06 |
---|---|
[์๋ฃ๊ตฌ์กฐ] Heap (1) (0) | 2021.09.06 |
[์๋ฃ๊ตฌ์กฐ] Tree ๊ตฌ์กฐ(2) (0) | 2021.08.29 |
[์๋ฃ๊ตฌ์กฐ] 05. Hash Table (0) | 2021.08.27 |
[์๋ฃ๊ตฌ์กฐ] 04. Linked List (0) | 2021.08.15 |