πμλ£κ΅¬μ‘°/μκ³ λ¦¬μ¦ - 6
νμ΅κΈ°λ‘
μ€λ λ€μ κ°μ λͺ©λ‘
- νΈλ¦¬ - 1
- νΈλ¦¬ - 2
- νΈλ¦¬ - 3
- νΈλ¦¬ - 4
- νΈλ¦¬ - 5
μ.. μ¬λ§ν΄μ ν루μ ν μ£Όμ μ© λλ΄λ €κ³ νλλ°
νΈλ¦¬κ° 8κ°μ΄λ μλ€..
μ΄νμ λλ μ ν΄μΌκ² λ€.
νΈλ¦¬
λ무μ²λΌ κ°μ§μ μμ΄ λΈλ¦° ννλ‘ νΈλ¦¬λΌκ³ νλ€.
Nodeμ Branch(κ°μ , edge)λ₯Ό μ΄μ©ν΄μ μ¬μ΄ν΄μ΄ ꡬμ±λμ§ μλλ‘ νμ±λ ꡬ쑰
μ£Όλ‘ μ΄μ§νΈλ¦¬ ννλ‘ νμμκ³ λ¦¬μ¦μ λ§μ΄ μ¬μ©λλ€.
μ©μ΄
- λ Έλ(Node) : λ°μ΄ν°λ₯Ό μ μ₯νλ μμ
- μ΅μμ λ Έλ(Root Node) : νΈλ¦¬μ 맨 μμ μλ λ Έλ
- λ 벨(Level) : κ° λ Έλμ κΉμ΄λ₯Ό λνλΈλ€. μ΅μμ λ Έλμ λ 벨μ 0, νμ nodeλ‘ κ°λλ§λ€ 1μ© μ¦κ°νλ€.
- κΉμ΄(Depth) : μ΅νμ λ Έλμ λ 벨
- μμ λ Έλ(Child Node) : μ΄λ€ λ Έλμ μ°κ²°λ λ€μ λ 벨μ λ Έλ
- λΆλͺ¨ λ Έλ(Parent Node) : μ΄λ€ λ Έλμ μ°κ²°λ μ΄μ λ 벨μ λ Έλ
- μ λ Έλ(Leaf Node) : μμμ΄ μλ λ Έλ
- νμ (Siblings) : κ°μ λΆλͺ¨λ₯Ό κ°μ§ λ Έλλ€ (μ¬μ§μμ 3κ³Ό 6μ νμ κ΄κ³μ΄λ€.)
μ΄μ§ νΈλ¦¬(Binary Tree)
μμμ μ΅λ λκ°κ°λ νΈλ¦¬
μ΄μ§ νμ νΈλ¦¬(Binary Search Tree, BST)
μμμ μ΅λ λκ°κ°λ μ΄μ§νΈλ¦¬μ νΉμ§μ κ°μ§κ³ ,
μΌμͺ½ μμλ Έλλ νμ¬ λ Έλλ³΄λ€ μμ κ°,
μ€λ₯Έμͺ½ μμλ Έλλ νμ¬ λ Έλλ³΄λ€ ν° κ°μ κ°μ§λ ꡬ쑰λ₯Ό λλ νΈλ¦¬.
μ©λ : λ°μ΄ν° κ²μ μ₯μ : νμ μλ κ°μ λ¨μ : 볡μ‘νλ€.
class BinaryNode:
def __init__(self, value):
self.value = value
self.left = None # μ’μΈ‘ μμμ μμμΌλ‘ μ΄κΈ°ν
self.right = None # μ°μΈ‘ μμμ μμμΌλ‘ μ΄κΈ°ν
class BinaryTree:
def __init__(self, head = None):
self.head = head
μ΄μ§νμνΈλ¦¬μμ λ°μ΄ν° μ½μ
- BSTμ μ΅μμ λ Έλκ° μλ κ²½μ° μ΅μμ λ Έλμ λ°μ΄ν°λ₯Ό μ½μ νκ³ μ’ λ£νλ€.
- μ΅μμ λ ΈλλΆν° νμμ μμνλ€.
- νμ¬ λ
Έλμ κ°λ³΄λ€ μ½μ
νλ €λ κ°μ΄ μλ€λ©΄ μΌμͺ½ λ
ΈλλΆν° λ€μ νμμ μμνκ³ ,
νμ¬ λ Έλμ κ°λ³΄λ€ μ½μ νλ €λ κ°μ΄ ν¬λ€λ©΄ μ€λ₯Έμͺ½ λ ΈλλΆν° λ€μ νμμ μμνλ€. - λ€μ νμμμΉμ λ Έλκ° μμλκΉμ§ 2λ²μ λ°λ³΅νλ€.
- λ€μ νμμμΉμ λ°μ΄ν°λ₯Ό μ½μ νλ€.
def insert(self, value):
if self.head == None:
self.head = Node(value)
return
current_node = self.head
while True:
if value < current_node.value:
if current_node.left == None:
current_node.left = Node(value)
return
else:
current_node = current_node.left
else:
if current_node.right == None:
current_node.right = Node(value)
return
else:
current_node = current_node.right
μ΄μ§νμνΈλ¦¬μμ λ°μ΄ν° νμ
- μ΅μμ λ ΈλλΆν° νμμ μμνλ€.
- νμ¬ λ
Έλμ κ°λ³΄λ€ μ½μ
νλ €λ κ°μ΄ μλ€λ©΄ μΌμͺ½ λ
ΈλλΆν° λ€μ νμμ μμνκ³ ,
νμ¬ λ Έλμ κ°λ³΄λ€ μ½μ νλ €λ κ°μ΄ ν¬λ€λ©΄ μ€λ₯Έμͺ½ λ ΈλλΆν° λ€μ νμμ μμνλ€. - κ°μ μ°Ύμ λκΉμ§ νμμ κ³μνλ€.
- κ°μ μ°Ύμλ€λ©΄ Trueλ₯Ό λ°ννλ€. (μ΄λ° κ²½μ° λ°λ³΅λ¬Έ λ΄μμ κ°μ μ°Ύμμ κ²μ΄λ€. -> λ°λ³΅λ¬Έ λ΄μ μμ±)
- κ°μ μ°Ύμ§ λͺ»ν κ²½μ° Falseλ₯Ό λ°ννλ€. (μ΄λ° κ²½μ° λ°λ³΅λ¬Έμ΄ μ’ λ£λμμ κ²μ΄λ€. -> ν¨μ μ’ λ£μμ μμ±)
def search(self, value):
current_node = self.head
while current_node:
if current_node.value == value:
return True
elif value < current_node.value:
current_node = current_node.left
else:
current_node = current_node.right
μ΄μ§νμνΈλ¦¬μμ λ°μ΄ν° μμ
λ°μ΄ν° μμ λ BSTꡬνμμ κ°μ₯ 볡μ‘ν λΆλΆμ΄λ€.
λ°μ΄ν° μμ λ μ¬λ¬κ°μ§ μΌμ΄μ€λ‘ λλ μ ꡬννλ κ²μ΄ λ 볡μ‘νλ€.
λ
Έλλ₯Ό μμ νκΈ° μν΄μλ ν΄λΉ λ
Έλμ μ리μ λ€μ΄κ° λ€λ₯Έ λ
Έλμ ν΄λΉ λ
Έλμ λΆλͺ¨ λ
Έλλ₯Ό μ΄μ΄μ€μΌ νκΈ° λλ¬Έμ λ
Έλλ₯Ό νμνλ©΄μ λΆλͺ¨ λ
Έλ λν λ°λ‘ μ μ₯ν΄λμΌνλ€.
λ, νμμ½λμλ μ‘°κΈ λ€λ₯΄κ² μ°Ύμλμ§ μ‘΄μ¬μ¬λΆλν μ μ₯ν΄λ¬μΌ νλ€.
- μμ ν λ Έλκ° μλ κ²½μ°
Falseλ₯Ό 리ν΄ν΄μ€λ€.
μ‘΄μ¬μ¬λΆλ₯Ό νμΈν΄μ κ°λ¨νκ² μ²λ¦¬ν μ μλ€.
- μμ νκ³ μ νλ λ
Έλμ μμμ΄ μλ κ²½μ°(Leaf Node)
ν΄λΉ λ Έλλ₯Ό μμ νκ³ λΆλͺ¨ λ Έλμμ ν΄λΉ λ Έλλ₯Ό κ°λ¦¬ν€λ λΆλΆμ Noneλ±μΌλ‘ μ΄κΈ°νν΄μ€μΌνλ€.
μ΄κ² λν κ°λ¨νκ² μ²λ¦¬ν μ μλ€.
-
μμ νκ³ μ νλ λ Έλμ μμμ΄ νλλ§ μ‘΄μ¬νλ κ²½μ°
νμ¬ λ Έλμ μμΉλ₯Ό νμ¬λ Έλμ μμλ Έλλ‘ λ³κ²½ν΄μ£Όλ©΄ λλ€.
μ΄κ² λν κ°λ¨νκ² μ²λ¦¬ν μ μλ€.
(λ€λ§, νμ¬ λ Έλκ° λΆλͺ¨ λ Έλμ μΌμͺ½ μμμΈμ§ μ€λ₯Έμͺ½ μμμΈμ§μ λ°λΌμλ§ μ²λ¦¬νλ©΄ λλ€. μ€μμ‘°μ¬!)
-
μμ νκ³ μ νλ λ Έλμ μμμ΄ λλ€ μ‘΄μ¬νλ κ²½μ°(κ°μ₯볡μ‘)
BSTμ ꡬνμ΄ λ³΅μ‘νλ€κ³ νλ μ΄μ μ΄λ€.
λκ°μ§ λ°©λ²μ΄ μ‘΄μ¬νλλ°,- νμ¬λ Έλμ μ’μΈ‘ μμλ Έλλ₯Ό 루νΈλ‘ νλ νΈλ¦¬μμ κ°μ₯ ν° κ°μ νμ¬ λ Έλμ μμΉμ λ³κ²½
- νμ¬λ Έλμ μ°μΈ‘ μμλ Έλλ₯Ό 루νΈλ‘ νλ νΈλ¦¬μμ κ°μ₯ μμ κ°μ νμ¬ λ Έλμ μμΉμ λ³κ²½
μΌλΆ ꡬν
μλλ λ°μ΄ν° μ½μ , νμμ ꡬνν μ½λ
class Node:
def __init__(self, value):
self.value = value
self.left = None
self.right = None
class BST:
def __init__(self, head = None):
self.head = head
def insert(self, value):
if self.head == None:
self.head = Node(value)
return
current_node = self.head
while True:
if value < current_node.value:
if current_node.left == None:
current_node.left = Node(value)
return
else:
current_node = current_node.left
else:
if current_node.right == None:
current_node.right = Node(value)
return
else:
current_node = current_node.right
def search(self, value):
current_node = self.head
while current_node:
if current_node.value == value:
return True
elif value < current_node.value:
current_node = current_node.left
else:
current_node = current_node.right
μμ ν ꡬνμ λ€μ ν¬μ€ν μ νλλ‘ νκ² λ€.
λκΈλ¨κΈ°κΈ°