오류에 대한 지적이나 질문, 토의 환영합니다. 자유롭게 댓글 남겨주세요!.!
배열의 이진 탐색 | 이진 탐색 트리 | |
---|---|---|
장점 | 공간의 소요가 적다. | 데이터 원소의 추가/삭제가 용이하다. |
단점 | 데이터 원소의 추가/삭제 시 배열을 밀어야 한다. | 공간 소요가 크다. |
평균 시간복잡도 |
insert(key, data)
: 주어진 data
원소를 key
값을 이용해 적당한 위치에 추가합니다.
remove(key)
: 특정 key
값을 가지는 원소를 트리에서 삭제합니다.
key
를 이용해 노드를 찾습니다.key
를 가진 노드가 없을 때key
를 가진 노드가 있을 때lookup(key)
: key
값을 가진 원소를 검색합니다.
inorder()
: key
의 순서대로 데이터 원소를 나열합니다.
min()
: 최소 key
값을 가진 노드를 반환합니다.
max()
: 최소 key
값을 가진 노드를 반환합니다.
# Node.insert():
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('Key %s already exists.' % key)
# BinSearchTree.insert():
def insert(self, key, data):
if self.root:
self.root.insert(key, data)
else:
self.root = Node(key, data)
#
# BinSearchTree.remove
def remove(self, key):
node, parent = self.lookup(key)
if node:
nChildren = node.countChildren()
if nChildren == 0:
if parent:
if node == parent.left:
parent.left = None
else:
parent.right = None
else:
self.root = None
elif nChildren == 1:
if node.left:
tmp = node.left
else:
tmp = node.right
if parent:
if node == parent.left:
parent.left = tmp
else:
parent.right = tmp
else:
self.root = tmp
else:
parent = node
successor = node.right
while successor.left:
parent = successor
successor = successor.left
node.key = successor.key
node.data = successor.data
if successor == parent.left:
parent.left = successor.right
else:
parent.right = successor.right
return True
else:
return False
# Node.lookup()
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
# BinSearchTree.lookup()
def lookup(self, key):
if self.root:
return self.root.lookup(key)
else:
return None, None
# Node.inorder()
def inorder(self):
traversal = []
if self.left:
traversal += self.left.inorder()
traversal.append(self)
if self.right:
traversal += self.right.inorder()
return traversal
#BinSearchTree.inorder()
def inorder(self):
if self.root:
return self.root.inorder()
else:
return []
# Node.min()
def min(self):
if self.left:
return self.self.min()
else:
return self
# BinSearchTree.min()
def min(self):
if self.root:
return self.root.min()
else:
return None
# Node.max()
def max(self):
if self.right:
return self.self.max()
else:
return self
# BinSearchTree.max()
def max(self):
if self.root:
return self.root.max()
else:
return None
이 글은 프로그래머스 스쿨 인공지능 데브코스 과정에서 공부한 내용을 바탕으로 정리한 글입니다.