class Node:
def __init__(self, key, data):
self.key = key
self.data = data
self.left = None
self.right = None
def inOrder(self): # 자신이 루트노드인 서브트리의 중위 순회
traversal = []
if self.left:
traversal += self.left.inOrder()
traversal.append(self)
if self.right:
traversal += self.right.inOrder()
return traversal
def min(self):
return self.left.min() if self.left else self
def max(self):
return self.right.min() if self.right else self
def lookup(self, key, parent=None):
if key < self.key:
if self.left:
return self.left.lookup(key, self)
else:
return None, None
elif key > self.key:
if self.right:
return self.right.lookup(key, self)
else:
return None, None
else:
return self, parent
def insert(self, key, data):
if key < self.key:
if self.left:
self.left.insert(key, data)
else:
self.left = Node(key, data)
elif key > self.key:
if self.right:
self.right.insert(key, data)
else:
self.right = Node(key, data)
else:
raise KeyError('중복된 원소는 삽입할 수 없습니다.')
def countChildren(self):
count = 0
if self.left:
count += 1
if self.right:
count += 1
return count
class BinaryTree:
def __init__(self):
self.root = None
def inOrder(self):
return self.root.inOrder() if self.root else []
def min(self):
return self.root.min() if self.root else None
def max(self):
return self.root.max() if self.root else None
def lookup(self, key): # 탐색 : key를 인자로 받아서 key에 해당하는 노드와 부모노드를 리턴
return self.root.lookup(key) if self.root else None, None
def insert(self, key, data):
if self.root:
self.root.insert(key, data)
else:
self.root = Node(key, data)
def remove(self, key):
removeNode, removeParentNode = self.lookup(key)
if removeNode == None:
return False
countChildren = removeNode.countChildren()
if countChildren == 0: # 삭제하려는 노드의 자식이 없을 경우
if removeParentNode == None: # 삭제하려는 노드가 root일 경우
self.root = None
elif removeParentNode.left == removeNode: # 삭제하려는 노드가 부모의 left일 경우
removeParentNode.left = None
else: # 삭제하려는 노드가 부모의 right일 경우
removeParentNode.right = None
elif countChildren == 1: # 삭제하려는 노드의 자식이 1개일 경우
if removeParentNode == None: # 삭제하려는 노드가 root일 경우
if removeNode.left:
self.root = removeNode.left
else:
self.root = removeNode.right
elif removeParentNode.left == removeNode:
if removeNode.left:
removeParentNode.left = removeNode.left
else:
removeParentNode.left = removeNode.right
elif removeParentNode.right == removeNode:
if removeNode.left:
removeParentNode.right = removeNode.left
else:
removeParentNode.right = removeNode.right
elif countChildren == 2: # 삭제하려는 노드의 자식이 2개일 경우
removeParentNode = removeNode
successorNode = removeNode.right
while successorNode.left:
removeParentNode = successorNode
successorNode = successorNode.left
removeNode.key = successorNode.key
removeNode.data = successorNode.data
if removeParentNode.left == successorNode:
removeParentNode.left = successorNode.right
elif removeParentNode.right == successorNode:
removeParentNode.right = successorNode.right
return True
댓글남기기