-
Notifications
You must be signed in to change notification settings - Fork 0
/
binarySearchTree.js
159 lines (135 loc) · 4.08 KB
/
binarySearchTree.js
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
class Node {
constructor(value) {
this.value = value;
this.left = null;
this.right = null;
}
}
class BinarySearchTree {
constructor() {
this.root = null;
}
// recursively traverse binary search tree for insertion O(log n)
traverseAndInsertNode(nodeToInsert, currentNode) {
const moveToNode = nodeToInsert.value > currentNode.value ? "right" : "left";
if (moveToNode === "right" && currentNode.right) {
this.traverseAndInsertNode(nodeToInsert, currentNode.right);
}
if (moveToNode === "right" && !currentNode.right) {
return currentNode.right = nodeToInsert;
}
if (moveToNode === "left" && currentNode.left) {
this.traverseAndInsertNode(nodeToInsert, currentNode.left);
}
if (moveToNode === "left" && !currentNode.left) {
return currentNode.left = nodeToInsert;
}
}
// insert a new node into a binary search tree
insert(value) {
const nodeToInsert = new Node(value);
if (!this.root) {
this.root = nodeToInsert;
return this;
}
return this.traverseAndInsertNode(nodeToInsert, this.root);
}
// recursively traverse & find node in a binary search tree by val O(log n)
find(value) {
if (!this.root) {
return null;
}
if (this.root.value === value) {
return this.root;
}
let foundNode = null;
function traverseAndSearchForNode(value, currentNode) {
if (value === currentNode.value) {
return foundNode = currentNode;
}
const moveToNode = value > currentNode.value ? "right" : "left";
if (moveToNode === "right" && currentNode.right) {
traverseAndSearchForNode(value, currentNode.right);
}
if (moveToNode === "right" && !currentNode.right) {
return foundNode = 'This Node is not in the binary search tree';
}
if (moveToNode === "left" && currentNode.left) {
traverseAndSearchForNode(value, currentNode.left);
}
if (moveToNode === "left" && !currentNode.left) {
return foundNode = 'This Node is not in the binary search tree';
}
}
traverseAndSearchForNode(value, this.root);
return foundNode;
}
// bfs to get all nodes in BST in order
breadthFirstSearch() {
let node = this.root
let visited = [];
let queue = [];
queue.push(node);
while (queue.length) {
node = queue.shift();
visited.push(node.value);
if (node.left) queue.push(node.left.value);
if (node.right) queue.push(node.right.value);
}
return visited;
}
depthFirstSearchPreOrder() {
let visited = [];
let node = this.root;
const traverse = function(node) {
visited.push(node.value);
if (node.left) traverse(node.left);
if (node.right) traverse(node.right);
}
traverse(node);
return visited;
}
depthFirstSearchPostOrder() {
let visited = [];
let node = this.root;
const traverse = function(node) {
if (node.left) traverse(node.left);
if (node.right) traverse(node.right);
visited.push(node.value);
}
traverse(node);
return visited;
}
depthFirstSearchInOrder() {
let visited = [];
let node = this.root;
const traverse = function(node) {
if (node.left) traverse(node.left);
visited.push(node.value);
if (node.right) traverse(node.right);
}
traverse(node);
return visited;
}
}
// construct binary search tree
let tree = new BinarySearchTree();
// insert new nodes & values into BST
console.log("\nInserting nodes into BST: \n");
const valuesInsertIntoBST = [10, 6, 15, 20, 3, 8];
for (let value of valuesInsertIntoBST) {
tree.insert(value);
}
console.log("BST after inserting nodes: ", tree);
// run BFS on BST
const visited1b = tree.breadthFirstSearch();
console.log(visitedb);
const visited = tree.depthFirstSearchInOrder();
console.log(visited);
console.log("\nSearching for nodes in BST: \n");
// search for values in BST
const valuesSearchForInBST = [16, 20, 19, 8, 21, 25];
for (let value of valuesSearchForInBST) {
console.log(`Searching for a node with a value of ${value}... `, tree.find(value));
};
console.log("\n");