Skip to content

Commit 3ab0f66

Browse files
Implemented invert binary tree (Bonus CoffeelessProgrammer#9)
1 parent ef795eb commit 3ab0f66

File tree

4 files changed

+74
-14
lines changed

4 files changed

+74
-14
lines changed

Data-Structures/Sequential/Queue.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import Node from '../Linked-Lists/NodeLL.ts';
1+
import Node from '../Linked-Lists/SinglyNode.ts';
22

33

44
export default class Queue<T> {

Data-Structures/Sequential/StackLL.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import Node from '../Linked-Lists/NodeLL.ts';
1+
import Node from '../Linked-Lists/SinglyNode.ts';
22

33

44
export default class StackLL<T> {

Data-Structures/Trees/BinarySearchTree.ts

+47-12
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,19 @@ import BNode from './BinaryTreeNode.ts';
22

33

44
export default class BinarySearchTree {
5+
6+
public static traverse(node: BNode | null) {
7+
if(node === null) return;
8+
9+
const tree = Object.create({});
10+
tree.value = node.getValue();
11+
tree.left = node.getLeft() === null ? null : this.traverse(node.getLeft());
12+
tree.right = node.getRight() === null ? null : this.traverse(node.getRight());
13+
return tree;
14+
}
15+
16+
// ------------------- Instance Code Starts Here -------------------
17+
518
private root: BNode | null;
619

720
constructor() {
@@ -172,6 +185,26 @@ export default class BinarySearchTree {
172185
}
173186
}
174187

188+
public invertTree(): boolean {
189+
if (!this.root) false;
190+
this._invertNode(this.root);
191+
return true;
192+
}
193+
194+
private _invertNode(current: BNode | null) {
195+
if (current === null) return;
196+
197+
this._swapChildren(current);
198+
this._invertNode(current.getLeft());
199+
this._invertNode(current.getRight());
200+
}
201+
202+
private _swapChildren(node: BNode) {
203+
const left = node.getLeft();
204+
node.setLeft(node.getRight());
205+
node.setRight(left);
206+
}
207+
175208
public equalsQuantum(tree: BinarySearchTree): boolean {
176209
return JSON.stringify(this) === JSON.stringify(tree);
177210
}
@@ -182,16 +215,6 @@ function printNode(tree: BinarySearchTree, value: number): void {
182215
console.log('Find', value + ':', !!requestedNode ? JSON.stringify(requestedNode) : 'Node not found.');
183216
}
184217

185-
function traverseFrom(node: BNode | null) {
186-
if(node === null) return;
187-
188-
const tree = Object.create({});
189-
tree.value = node.getValue();
190-
tree.left = node.getLeft() === null ? null : traverseFrom(node.getLeft());
191-
tree.right = node.getRight() === null ? null : traverseFrom(node.getRight());
192-
return tree;
193-
}
194-
195218
//---------------------------------------------------------------------
196219
// ---------- MAIN PROGRAM ----------
197220
//---------------------------------------------------------------------
@@ -210,12 +233,24 @@ if (import.meta.main) {
210233
tree.insert(170);
211234
tree.insert(15);
212235
tree.insert(1);
213-
console.log('Tree: ', JSON.stringify(traverseFrom(tree.getRoot())));
236+
console.log('Tree: ', JSON.stringify(BinarySearchTree.traverse(tree.getRoot())));
214237
tree.remove(20);
215238
printNode(tree, 4);
216239
printNode(tree, 17);
217240
printNode(tree, 40);
218241
printNode(tree, 170);
242+
console.log('Original Tree: ', JSON.stringify(BinarySearchTree.traverse(tree.getRoot())));
243+
tree.invertTree();
244+
console.log('Inverse Tree: ', JSON.stringify(BinarySearchTree.traverse(tree.getRoot())));
219245

220246
// RUN: deno run Data-Structures/Trees/BinarySearchTree.ts
221-
}
247+
}
248+
249+
// --------------------------- Terminal Output: ---------------------------
250+
// Tree: {"value":9,"left":{"value":4,"left":{"value":1,"left":null,"right":null},"right":{"value":6,"left":null,"right":null}},"right":{"value":20,"left":{"value":15,"left":null,"right":null},"right":{"value":170,"left":null,"right":null}}}
251+
// Find 4: {"value":4,"left":{"value":1,"left":null,"right":null},"right":{"value":6,"left":null,"right":null}}
252+
// Find 17: Node not found.
253+
// Find 40: Node not found.
254+
// Find 170: {"value":170,"left":{"value":15,"left":null,"right":null},"right":null}
255+
// Original Tree: {"value":9,"left":{"value":4,"left":{"value":1,"left":null,"right":null},"right":{"value":6,"left":null,"right":null}},"right":{"value":170,"left":{"value":15,"left":null,"right":null},"right":null}}
256+
// Inverse Tree: {"value":9,"left":{"value":170,"left":null,"right":{"value":15,"left":null,"right":null}},"right":{"value":4,"left":{"value":6,"left":null,"right":null},"right":{"value":1,"left":null,"right":null}}}

Playground/Interviews/HealthcareHM.ts

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
function findNumOccurrences(color: string, colorsArr: string[]): number {
2+
let occurrences = 0;
3+
4+
for (let c of colorsArr) {
5+
if (color === c) ++occurrences;
6+
}
7+
8+
return occurrences;
9+
}
10+
11+
console.log(findNumOccurrences("black", ["white", "red", "black", "green", "black", "red"]));
12+
13+
function unique(array: Array<number> | Array<string>): boolean {
14+
const found = new Set();
15+
for (let element of array) {
16+
if (found.has(element)) return false;
17+
else found.add(element);
18+
}
19+
return true;
20+
}
21+
22+
console.log(unique([1,4,6,8,2]));
23+
console.log(unique([1,4,6,8,4,2]));
24+
25+
// RUN: deno run Playground/Interviews/HealthcareHM.ts

0 commit comments

Comments
 (0)