가수면
이진 검색 트리 구현 본문
이진 탐색 트리와 이진 힙 비교
- 힙은 각 노드의 값이 자식 노드보다 크거나 같음(Max Heap의 경우)
- 이진 탐색 트리는 왼쪽 자식 노드의 값이 가장 작고, 그 다음 부모 노드, 그 다음 오른쪽 자식 노드 값이 가장 큼
- 힙은 이진 탐색 트리의 조건인 자식 노드에서 작은 값은 왼쪽, 큰 값은 오른쪽이라는 조건은 없음
- 힙의 왼쪽 및 오른쪽 자식 노드의 값은 오른쪽이 클 수도 있고, 왼쪽이 클 수도 있음
insert 매소드
class Node {
constructor(value) {
this.value = value;
this.left = null;
this.right = null;
}
}
class BinarySearchTree {
constructor() {
this.root = null;
}
insert(value) {
let newNode = new Node(value);
if (this.root === null) {
this.root = newNode;
return this;
}
let current = this.root;
while (true) {
if (value === current.value) return undefined;
if (value < current.value) {
if (current.left === null) {
current.left = newNode;
return this;
}
current = current.left;
} else {
if (current.right === null) {
current.right = newNode;
return this;
}
current = current.right;
}
}
}
}
find 매소드
class Node {
constructor(value) {
this.value = value;
this.left = null;
this.right = null;
}
}
class BinarySearchTree {
constructor() {
this.root = null;
}
insert(value) {
let newNode = new Node(value);
if (this.root === null) {
this.root = newNode;
return this;
}
let current = this.root;
while (true) {
if (value === current.value) return undefined;
if (value < current.value) {
if (current.left === null) {
current.left = newNode;
return this;
}
current = current.left;
} else {
if (current.right === null) {
current.right = newNode;
return this;
}
current = current.right;
}
}
}
find(value) {
if (this.root === null) return undefined;
let current = this.root,
found = false;
while (current && !found) {
if (value < current.value) {
current = current.left;
} else if (value > current.value) {
current = current.right;
} else {
found = true;
}
}
if (!found) return undefined;
return current;
}
}
파이썬 ver.
class Node:
def __init__(self, value):
self.value = value
self.left = None
self.right = None
class Binary_search_tree:
def __init__(self):
self.root = None
def insert(self, insert_value):
new_node = Node(insert_value)
if self.root is None:
self.root = new_node
return self
current = self.root
while True:
if current.value == insert_value:
return None
if current.value > insert_value:
if current.left is None:
current.left = new_node
return self
current = current.left
else:
if current.right is None:
current.right = new_node
return self
current = current.right
def find(self, target):
if self.root is None:
return None
current = self.root
while True:
if self.root is None:
return None
elif current.value > target:
current = current.left
elif current.value < target:
current = current.right
else:
return current
'CS > CS' 카테고리의 다른 글
이진 힙 구현 (0) | 2023.05.29 |
---|---|
트리 순회 (0) | 2023.05.28 |
스택, 큐 구현 (0) | 2023.05.26 |
이중 연결 리스트 구현 (0) | 2023.05.25 |
단일 연결 리스트 구현 (0) | 2023.05.23 |
Comments