모든 노드에 대해서 왼쪽 서브트리에 있는 데이터는 모두 현재 노드의 값보다 작고
오른쪽 서브 트리에 있는 데이터는 모두 현재 노드의 값보다 큰 성질을 만족하는 이진트리. (중복되는 데이터 원소는 없는 것으로 가정)
?! 정렬된 배열을 이용한 이진 탐색과 비슷하다.
장점 : 데이터의 원소의 추가, 삭제가 용이
단점 : 공간 소요가 큼
항상 O(logn)의 탐색복잡도를 가질까?? => 아닌 상황이 생긴다.
class Node:
def __init__(self, key, data):
self.key = key
self.data = data
self.left = None
self.rigt = None
class BinSearchTree:
def __init__(self):
self.root = None
class Node:
def inorder(self):
traversal = []
if self.left:
traversal += self.left.inorder()
traversal.append(self)
if self.right:
traversal += self.right.inorder()
return traversal
class BinSearchTree:
def inorder(self):
if self.root:
return self.root.inorder()
else:
return []
class BinSearchTree:
def min(self):
if self.root:
return self.root.min()
else:
return self
def max(self):
==> min()과 완전히 대칭 각자 구현.
class BinSearchTree:
def lookup(self,key):
if self.root:
return self.root.lookup(key)
else:
return None, None
class Node:
def lookup(self, key, parent=None)
if key < self.key:
if self.left:
return self.left.lookup(key,self)
## self는 self.left의 부모
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
class BinSearchTree:
def insert(self, key, data):
if self.root:
self.root.insert(key, data)
else:
# root가 없으면 insert하는 key와 data로 초기화
self.root = Node(key, data)
class Node:
def insert(self,key,data):
if key < self.key:
elif key > self.key:
else:
# 값이 같은 경우 .. 에러발생하도록
raise KeyError('...')
==> 재귀적 방법으로 풀 수 있다.
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('값이 같습니다.')