-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
175 lines (139 loc) · 3.39 KB
/
index.js
File metadata and controls
175 lines (139 loc) · 3.39 KB
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
// BINARY SEARCH TREE
class Node {
constructor(value) {
this.value = value;
this.left = null;
this.right = null;
}
}
class BinarySearchTree {
constructor(value) {
this.root = new Node(value);
this.count = 1;
}
size() {
return this.count;
}
insert(value) {
this.count++;
let newNode = new Node(value);
const searchTree = node => {
// if value < node.value, go left
if (value < node.value) {
// if no left child, append new Node
if (!node.left) {
node.left = newNode;
}
// if left child, look left again
else {
searchTree(node.left);
}
}
// if value > node.value, go right
if (value > node.value) {
if (!node.right) {
node.right = newNode
}
// if right child, look right again
else {
searchTree(node.right);
}
}
}
searchTree(this.root);
}
min() {
let currentNode = this.root;
// continue traversing left until no more children
while (currentNode.left) {
currentNode = currentNode.left;
}
return currentNode.value;
}
max() {
let currentNode = this.root;
// continue traversing left until no more children
while (currentNode.right) {
currentNode = currentNode.right;
}
return currentNode.value;
}
contains(value) {
let currentNode = this.root;
while (currentNode) {
if (value === currentNode.value) {
return true;
}
if (value < currentNode.value) {
currentNode = currentNode.left;
} else {
currentNode = currentNode.right;
}
}
return false;
}
// Depth first search - branch by branch
// in-order
// left, root, right
depthFirstSearchInOrder() {
let result = [];
const traverse = node => {
// if left child exists, go left again
if (node.left) traverse(node.left);
// capture root node value
result.push(node.value);
// if right child exists, go right again
if (node.right) traverse(node.right);
}
traverse(this.root);
return result;
}
// pre-order
// root. left, right
depthFirstSearchPreOrder() {
let result = [];
const traverse = node => {
// capture root node value
result.push(node.value);
// if left child exists, go left again
if (node.left) traverse(node.left);
// if right child exists, go right again
if (node.right) traverse(node.right);
}
traverse(this.root);
return result;
}
// post-order
// left, right, root
depthFirstSearchPostOrder() {
let result = [];
const traverse = node => {
// if left child exists, go left again
if (node.left) traverse(node.left);
// if right child exists, go right again
if (node.right) traverse(node.right);
// capture root node value
result.push(node.value);
}
traverse(this.root);
return result;
}
// Breadth first search - level by level
// use a queue!
breadthFirstSearch() {
let result = [];
let queue = [];
queue.push(this.root);
while(queue.length) {
let currentNode = queue.shift();
result.push(currentNode.value);
if(currentNode.left) {
queue.push(currentNode.left);
}
if(currentNode.right) {
queue.push(currentNode.right);
}
}
return result;
}
}