forked from knaxus/problem-solving-javascript
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathutils.js
112 lines (100 loc) · 3.05 KB
/
utils.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
const Node = require('./Node');
const utils = {
// eslint-disable-next-line consistent-return
insert(root, value) {
if (root === null) {
const newNode = new Node(value);
// eslint-disable-next-line no-param-reassign
root = newNode;
return root;
}
if (value < root.value) {
// eslint-disable-next-line no-param-reassign
root.leftChild = this.insert(root.leftChild, value);
return root;
}
if (value > root.value) {
// eslint-disable-next-line no-param-reassign
root.rightChild = this.insert(root.rightChild, value);
return root;
}
},
preorder(root, array) {
if (root === null) return array;
array.push(root.value);
this.preorder(root.leftChild, array);
this.preorder(root.rightChild, array);
return array;
},
inorder(root, array) {
if (root === null) return array;
this.inorder(root.leftChild, array);
array.push(root.value);
this.inorder(root.rightChild, array);
return array;
},
postorder(root, array) {
if (root === null) return array;
this.postorder(root.leftChild, array);
this.postorder(root.rightChild, array);
array.push(root.value);
return array;
},
// eslint-disable-next-line consistent-return
search(root, value) {
if (root === null) return false;
if (value === root.value) return true;
if (value < root.value) {
return this.search(root.leftChild, value);
}
if (value > root.value) {
return this.search(root.rightChild, value);
}
},
delete(root, value) {
if (root === null) {
return root;
}
if (value > root.value) {
// eslint-disable-next-line no-param-reassign
root.rightChild = this.delete(root.rightChild, value);
} else if (value < root.value) {
// eslint-disable-next-line no-param-reassign
root.leftChild = this.delete(root.leftChild, value);
} else {
// found the node
if (root.leftChild === null) {
// there is a right sub-tree
return root.rightChild;
}
if (root.rightChild === null) {
// there is a left sub-tree
return root.leftChild;
}
/**
* the root contain 2 childs, we got 2 options:
* 1. We can either find the Node with minimum value at from the right sub-tree
* 2. Or, we can find the Node with maximum value from the left sub-tree
*
* I'm picking up 1 here
*/
const minRightNode = this.findMinNode(root.rightChild);
// eslint-disable-next-line no-param-reassign
root.value = minRightNode.value;
// eslint-disable-next-line no-param-reassign
root.rightChild = this.delete(root.rightChild, minRightNode.value);
return root;
}
return root;
},
findMinNode(root) {
/** The minnimum values is the let most leaf node in BST */
if (root.leftChild === null) return root;
return this.findMinNode(root.leftChild);
},
findMaxNode(root) {
if (root.rightChild === null) return root;
return this.findMaxNode(root.rightChild);
},
};
module.exports = utils;