Binary Search Tree(이진 탐색 트리) 구현하기 🌲
May 11, 2023
트리에 대해서 공부했으니, 이진탐색트리를 구현하는 방법에 대해서 정리해보려고 합니다. :)
✅ init
Node를 만들 클래스, Binary Search Tree 클래스를 만들어줍니다.
1 2 3 4 5 6 7
| class Node { constructor(value) { this.value = value; this.left = null; this.right = null; } }
|
1 2 3 4 5
| class BinarySearchTree { constructor() { this.root = null; } }
|
🚀 insert method
Pseudo Code
- 새로운 노드(newNode)를 만든다.
- root Node와 비교한다.
- root Node가 없다면 newNode를 root로 만든다.
- root Node가 있다면 newNode의 값이 큰 지, 작은 지 비교한다.
- root Node보다 크다면?
- root.right에 속한 노드를 확인한다.
- root.right가 있다면 이전 스텝을 동일하게 반복한다.
- root.right가 없다면 newNode를 root.right로 만든다.
- root Node보다 작다면?
- root.left에 속한 노드를 확인한다.
- root.left 있다면 이전 스텝을 동일하게 반복한다.
- root.left 없다면 newNode를 root.left로 만든다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| class Node { constructor(value) { this.value = value; this.left = null; this.right = null; } }
class BinarySearchTree { constructor() { this.root = null; }
insert(value) { const 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; } else { current = current.left; } } else if (value > current.value) { if (current.right === null) { this.root.right = newNode; return this; } else { current = current.right; } } } } }
|
contains method
🚀 Pseudo Code
- root부터 시작
- root가 없다면 탐색할 필요가 없음
- root가 있다면, new Node의 값이 root의 값보다 작은지 큰지 비교한다.
- 만약 new Node의 값이 더 크다면?
- current = current.right
- 종료조건에 도달할 때까지 계속 반복한다.
- 값을 찾았다면 return true
- 만약 new Node의 값이 더 작다면?
- current = current.left
- 종료 조건에 도달할 때까지 계속 반복한다.
- 값을 찾았다면 return true
- 종료조건까지 찾지 못했다면 return false
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| contains (value) { if(this.root === null) return false;
let current = this.root; let found = false;
while(current && !found) { if(value < current.value) { current = current.left;
} else if(value > current.value) { current = current.right; } else { return true } } return false; }
|
🏖️ Array를 이용해서 푸는 방법
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| const array = [1, 1, 5, 400, 599, 1004, 2876, 8712];
function BinarySearchTree(array, findValue) { let left = 0; let right = array[array.length - 1]; let mid = Math.floor((left + right) / 2);
while (left < right) { if (array[mid] === findValue) { return mid; }
if (array[mid] < findValue) { left = mid + 1; } else { right = mid - 1; }
mid = Math.floor((left + right) / 2); }
return -1; }
|