# 노드 클래스를 만든다. classNode:def__init__(self, value):
self.value = value
self.left = None
self.right = None
# 이진 탐색 트리 구조 classNodeMgmt:def__init__(self, head):
self.head = head
definsert(self, value):
self.current_node = self.head
whileTrue:
if value < self.current_node.value: # 새로 들어온 value < 현재 노드 이면, 현재 노드의 왼쪽 노드가 현재 노드 기준이 된다. if self.current_node.left != None:
self.current_node = self.current_node.left
else: # 현재 노드 왼쪽에 아무 노드도 x -> 새로 들어온 value가 그 왼쪽에 들어 간다.
self.current_node.left = Node(value)
breakelse:
if self.current_node.right != None: # 새로 들어온 value > 현재 노드 이면, 현재 노드의 오른쪽 노드가 현재 노드 기준이 된다.
self.current_node = self.current_node.right
else: # 현재 노드 오른쪽에 아무 노드도 x -> 새로 들어온 value가 그 오른쪽에 들어 간다.
self.current_node.right = Node(value)
breakdefsearch(self, value):
self.current_node = self.head
while self.current_node:
if self.current_node.value == value:
returnTrueelif value < self.current_node.value:
self.current_node = self.current_node.left
else:
self.current_node = self.current_node.right
returnFalse
head = Node(2)
BST = NodeMgmt(head)
BST.insert(4)
BST.insert(3)
BST.insert(1)
BST.insert(8)
BST.search(3)
True
삭제 기능 (Delete)
케이스에 따라 굉장히 다양하다.
1. 삭제할 노드가 있는지 확인 하는 절차
# def delete(self, value):
searched = False
self.current_node = self.head
self.parent = self.head
while self.current_node:
if self.current_node.value == value: # 찾는 노드가 head인 경우, True를 넣고 종료.
searched = Truebreakelif value < self.current_node.value: # 찾는 노드가 더 작으면, 왼쪽 노드를 확인해야 하므로 왼쪽 노드를 current(기준)로 넣는다. 이를 기준으로 다시 while문.
self.parent = self.current_node
self.current_node = self.current_node.left
else:
self.parent = self.current_node # 찾는 노드가 더 크면, 오른쪽 노드를 확인해야 한다. 이 오른쪽 노드를 기준으로 다시 while문.
self.current_node = self.current_node.right
if searched == False: # 찾는 노드가 존재x -> False 리턴. returnFalse
2. 삭제할 노드가 Leaf Node인 경우
# self.current_node : 삭제하길 원하는 노드.# self.parent.value : 삭제하길 원하는 노드의 parent# value : 삭제하고자 하는 valueifself.current_node.left == None andself.current_node.right == None: # 자식 노드가 없으므로 leaf node이며 if 문이 실행된다.if value < self.parent.value: # 삭제할 노드의 parent노드가 삭제하고자 하는 value 보다 클 때, parent의 왼쪽 노드를 삭제. self.parent.left = None
else:
self.parent.right = None
del self.current_node
3. 삭제할 노드가 Child Node를 한 개 가지고 있을 경우
ifself.current_node.left !=None and self.current_node.right ==None: # 왼쪽 노드를 가지고 있는 경우
if value <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