본문으로 바로가기

[자료구조] 이진탐색트리

category 알고리즘 6년 전

종만북을 읽으면서 자료구조를 구현해보고 있다.

분명 예전에 다 배우고, 구현해봤던 건데 (자바와 파이썬 둘 다로)

delete가 잘 생각이 안 나서 막 찾아봤다.

 

# 파이썬으로 binary tree 구현하기
class Node():
def __init__(self, data):
self.data = data
self.left = None
self.right = None
def __str__(self):
return self.data, self.left, self.right
class BinaryTree():
def __init__(self):
self.root = None
# root를 계속 갱신해나가면서
# root가 없다면
def insert(self, node, data):
self.root = self._insert_value(self.root, data)
return self.root is not None
def _insert_value(self, node, data):
if node is None:
node = Node(data)
else:
if data <= node.data:
node.left = self._insert_value(node.left, data)
else:
node.right = self._insert_value(node.right, data)
return node
def find(self, key):
return self._find_value(self.root, key)
def _find_value(self, root, key):
if root is None or root.data == key:
return root is not None
elif key <= root.data:
return self._find_value(root.left, key)
else:
return self._find_value(root.right, key)
def delete(self, key):
return self._delete_value(self.root, key)
def _delete_value(self, node, key):
if node is None:
return node, False
deleted = False
if key == node.data:
deleted = True
# 노드의 자식 노드가 둘 다 있을 때는
if node.left and node.right:
# replace the node to the leftmost of node.right
# 오른쪽 자식의 가장 왼쪽 자식을 가져온다 (혹은 왼쪽 자식의 가장 오른쪽 자식도 ok)
# 목적 : 트리의 변동성 최소
parent, child = node, node.right
while child.left is not None:
parent, child = child, child.left
# child의 left에 node의 원래 left를 붙이고
child.left = node.left
# child의 right를 parent의 left로 올리고
# child의 right에 node의 원래 right를 붙인 후
if parent != node:
parent.left = child.right
child.right = node.right
# child로 node를 대체
node = child
elif node.left or node.right:
node = node.left or node.right
else:
node = None
elif key < node.data:
node.left, deleted = self._delete_value(node.left, key)
else:
node.right, deleted = self._delete_value(node.right, key)
return node, deleted

참고한 링크들

http://ejklike.github.io/2018/01/09/traversing-a-binary-tree-1.html

 

Study Note - 파이썬을 사용한 이진 트리와 순회 알고리즘 구현 (1)

이진 트리 (binary tree)는 최대 두 개의 자식 노드를 가지는 트리 형태의 자료구조로서, 단순히 값을 저장하기 위한 용도로 사용되기 보다는 효율적인 탐색 혹은 정렬을 위해 사용된다. 이진 탐색 트리 (binary search tree)를 사용하면 주어진 값 혹은 이보다 작거나 큰 값들을 평균 $O(\log n)$의 시간복잡도로 찾을 수 있다. 이진 트리의 일종인 힙(heap)을 사용하는 힙 정렬(heap sort)은 $O(n\log n)$의 시간

ejklike.github.io

https://mattlee.tistory.com/30

 

<이진 탐색트리> 탐색, 삽입, 삭제 알고리즘 및 시간복잡도 분석

# 이진 탐색 트리란? // 이 글은 복붙 및 드래그가 불가하니 밑에 소스파일을 다운로드 해주세요. 이진 탐색 트리(binary search tree)는 이진 트리 기반의 탐색을 위한 자료 구조이다. 이진 탐색 트리의 조건에는..

mattlee.tistory.com

 

알고리즘카테고리의 다른글

programmars 네트워크  (0) 2019.09.21
programmers 타겟 넘버  (0) 2019.09.21
BOJ 14891 톱니바퀴  (0) 2019.09.18
BOJ 14889 스타트와 링크  (0) 2019.09.18
BOJ 14890 경사로  (0) 2019.09.18