data-structure-typed 1.37.1 → 1.37.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +3 -1
- package/dist/data-structures/binary-tree/avl-tree.d.ts +5 -7
- package/dist/data-structures/binary-tree/avl-tree.js +7 -9
- package/dist/data-structures/binary-tree/avl-tree.js.map +1 -1
- package/dist/data-structures/binary-tree/binary-tree.d.ts +61 -209
- package/dist/data-structures/binary-tree/binary-tree.js +133 -269
- package/dist/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/data-structures/binary-tree/bst.d.ts +22 -19
- package/dist/data-structures/binary-tree/bst.js +68 -54
- package/dist/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/data-structures/binary-tree/tree-multiset.d.ts +2 -36
- package/dist/data-structures/binary-tree/tree-multiset.js +3 -81
- package/dist/data-structures/binary-tree/tree-multiset.js.map +1 -1
- package/dist/data-structures/heap/heap.d.ts +1 -1
- package/dist/data-structures/heap/heap.js +1 -1
- package/dist/types/data-structures/binary-tree.d.ts +4 -2
- package/dist/types/data-structures/binary-tree.js +6 -6
- package/dist/types/data-structures/binary-tree.js.map +1 -1
- package/dist/types/data-structures/index.d.ts +2 -0
- package/lib/data-structures/binary-tree/avl-tree.d.ts +5 -7
- package/lib/data-structures/binary-tree/avl-tree.js +7 -9
- package/lib/data-structures/binary-tree/binary-tree.d.ts +61 -209
- package/lib/data-structures/binary-tree/binary-tree.js +134 -270
- package/lib/data-structures/binary-tree/bst.d.ts +22 -19
- package/lib/data-structures/binary-tree/bst.js +69 -55
- package/lib/data-structures/binary-tree/tree-multiset.d.ts +2 -36
- package/lib/data-structures/binary-tree/tree-multiset.js +4 -82
- package/lib/data-structures/heap/heap.d.ts +1 -1
- package/lib/data-structures/heap/heap.js +1 -1
- package/lib/types/data-structures/binary-tree.d.ts +4 -2
- package/lib/types/data-structures/binary-tree.js +5 -5
- package/lib/types/data-structures/index.d.ts +2 -0
- package/package.json +6 -6
- package/src/data-structures/binary-tree/avl-tree.ts +7 -9
- package/src/data-structures/binary-tree/binary-tree.ts +79 -54
- package/src/data-structures/binary-tree/bst.ts +37 -32
- package/src/data-structures/binary-tree/tree-multiset.ts +3 -3
- package/src/types/data-structures/binary-tree.ts +2 -2
- package/test/config.ts +1 -0
- package/test/integration/avl-tree.test.ts +23 -21
- package/test/integration/bst.test.ts +49 -44
- package/test/unit/data-structures/binary-tree/binary-tree.test.ts +50 -0
- package/test/unit/data-structures/binary-tree/bst.test.ts +8 -1
- package/test/unit/data-structures/binary-tree/tree-multiset.test.ts +2 -1
- package/test/unit/data-structures/linked-list/linked-list.test.ts +1 -1
- package/test/utils/big-o.ts +2 -1
- package/umd/bundle.min.js +1 -1
- package/umd/bundle.min.js.map +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {AVLTree} from 'avl-tree-typed';
|
|
1
|
+
import {AVLTree, CP} from 'avl-tree-typed';
|
|
2
2
|
|
|
3
3
|
describe('AVL Tree Test', () => {
|
|
4
4
|
it('should perform various operations on a AVL Tree', () => {
|
|
@@ -12,7 +12,7 @@ describe('AVL Tree Test', () => {
|
|
|
12
12
|
expect(node6 && tree.getHeight(node6)).toBe(3);
|
|
13
13
|
expect(node6 && tree.getDepth(node6)).toBe(1);
|
|
14
14
|
|
|
15
|
-
const getNodeById = tree.get(10
|
|
15
|
+
const getNodeById = tree.get(10);
|
|
16
16
|
expect(getNodeById?.key).toBe(10);
|
|
17
17
|
|
|
18
18
|
const getMinNodeByRoot = tree.getLeftMost();
|
|
@@ -22,75 +22,77 @@ describe('AVL Tree Test', () => {
|
|
|
22
22
|
const getMinNodeBySpecificNode = node15 && tree.getLeftMost(node15);
|
|
23
23
|
expect(getMinNodeBySpecificNode?.key).toBe(12);
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
let subTreeSum = 0;
|
|
26
|
+
node15 && tree.subTreeTraverse(node => (subTreeSum += node.key), 15);
|
|
26
27
|
expect(subTreeSum).toBe(70);
|
|
27
28
|
|
|
28
|
-
|
|
29
|
+
let lesserSum = 0;
|
|
30
|
+
tree.lesserOrGreaterTraverse(node => (lesserSum += node.key), CP.lt, 10);
|
|
29
31
|
expect(lesserSum).toBe(45);
|
|
30
32
|
|
|
31
33
|
// node15 has type problem. After the uniform design, the generics of containers (DirectedGraph, BST) are based on the type of value. However, this design has a drawback: when I attempt to inherit from the Vertex or BSTNode classes, the types of the results obtained by all methods are those of the parent class.
|
|
32
34
|
expect(node15?.val).toBe(15);
|
|
33
35
|
|
|
34
|
-
const dfs = tree.dfs(
|
|
36
|
+
const dfs = tree.dfs(node => node, 'in');
|
|
35
37
|
expect(dfs[0].key).toBe(1);
|
|
36
38
|
expect(dfs[dfs.length - 1].key).toBe(16);
|
|
37
39
|
|
|
38
40
|
tree.perfectlyBalance();
|
|
39
|
-
const bfs = tree.bfs(
|
|
41
|
+
const bfs = tree.bfs(node => node);
|
|
40
42
|
expect(tree.isPerfectlyBalanced()).toBe(true);
|
|
41
43
|
expect(bfs[0].key).toBe(8);
|
|
42
44
|
expect(bfs[bfs.length - 1].key).toBe(16);
|
|
43
45
|
|
|
44
|
-
expect(tree.
|
|
46
|
+
expect(tree.delete(11)[0].deleted?.key).toBe(11);
|
|
45
47
|
expect(tree.isAVLBalanced()).toBe(true);
|
|
46
48
|
expect(node15 && tree.getHeight(node15)).toBe(2);
|
|
47
49
|
|
|
48
|
-
expect(tree.
|
|
50
|
+
expect(tree.delete(1)[0].deleted?.key).toBe(1);
|
|
49
51
|
expect(tree.isAVLBalanced()).toBe(true);
|
|
50
52
|
expect(tree.getHeight()).toBe(4);
|
|
51
53
|
|
|
52
|
-
expect(tree.
|
|
54
|
+
expect(tree.delete(4)[0].deleted?.key).toBe(4);
|
|
53
55
|
expect(tree.isAVLBalanced()).toBe(true);
|
|
54
56
|
expect(tree.getHeight()).toBe(4);
|
|
55
57
|
|
|
56
|
-
expect(tree.
|
|
58
|
+
expect(tree.delete(10)[0].deleted?.key).toBe(10);
|
|
57
59
|
expect(tree.isAVLBalanced()).toBe(true);
|
|
58
60
|
expect(tree.getHeight()).toBe(3);
|
|
59
61
|
|
|
60
|
-
expect(tree.
|
|
62
|
+
expect(tree.delete(15)[0].deleted?.key).toBe(15);
|
|
61
63
|
expect(tree.isAVLBalanced()).toBe(true);
|
|
62
64
|
|
|
63
65
|
expect(tree.getHeight()).toBe(3);
|
|
64
66
|
|
|
65
|
-
expect(tree.
|
|
67
|
+
expect(tree.delete(5)[0].deleted?.key).toBe(5);
|
|
66
68
|
expect(tree.isAVLBalanced()).toBe(true);
|
|
67
69
|
expect(tree.getHeight()).toBe(3);
|
|
68
70
|
|
|
69
|
-
expect(tree.
|
|
71
|
+
expect(tree.delete(13)[0].deleted?.key).toBe(13);
|
|
70
72
|
expect(tree.isAVLBalanced()).toBe(true);
|
|
71
73
|
expect(tree.getHeight()).toBe(3);
|
|
72
74
|
|
|
73
|
-
expect(tree.
|
|
75
|
+
expect(tree.delete(3)[0].deleted?.key).toBe(3);
|
|
74
76
|
expect(tree.isAVLBalanced()).toBe(true);
|
|
75
77
|
expect(tree.getHeight()).toBe(3);
|
|
76
78
|
|
|
77
|
-
expect(tree.
|
|
79
|
+
expect(tree.delete(8)[0].deleted?.key).toBe(8);
|
|
78
80
|
expect(tree.isAVLBalanced()).toBe(true);
|
|
79
81
|
expect(tree.getHeight()).toBe(3);
|
|
80
82
|
|
|
81
|
-
expect(tree.
|
|
82
|
-
expect(tree.
|
|
83
|
+
expect(tree.delete(6)[0].deleted?.key).toBe(6);
|
|
84
|
+
expect(tree.delete(6).length).toBe(0);
|
|
83
85
|
expect(tree.isAVLBalanced()).toBe(true);
|
|
84
86
|
expect(tree.getHeight()).toBe(2);
|
|
85
87
|
|
|
86
|
-
expect(tree.
|
|
88
|
+
expect(tree.delete(7)[0].deleted?.key).toBe(7);
|
|
87
89
|
expect(tree.isAVLBalanced()).toBe(true);
|
|
88
90
|
expect(tree.getHeight()).toBe(2);
|
|
89
91
|
|
|
90
|
-
expect(tree.
|
|
92
|
+
expect(tree.delete(9)[0].deleted?.key).toBe(9);
|
|
91
93
|
expect(tree.isAVLBalanced()).toBe(true);
|
|
92
94
|
expect(tree.getHeight()).toBe(2);
|
|
93
|
-
expect(tree.
|
|
95
|
+
expect(tree.delete(14)[0].deleted?.key).toBe(14);
|
|
94
96
|
expect(tree.isAVLBalanced()).toBe(true);
|
|
95
97
|
expect(tree.getHeight()).toBe(1);
|
|
96
98
|
|
|
@@ -100,7 +102,7 @@ describe('AVL Tree Test', () => {
|
|
|
100
102
|
expect(lastBFSIds[1]).toBe(2);
|
|
101
103
|
expect(lastBFSIds[2]).toBe(16);
|
|
102
104
|
|
|
103
|
-
const lastBFSNodes = tree.bfs(
|
|
105
|
+
const lastBFSNodes = tree.bfs(node => node);
|
|
104
106
|
expect(lastBFSNodes[0].key).toBe(12);
|
|
105
107
|
expect(lastBFSNodes[1].key).toBe(2);
|
|
106
108
|
expect(lastBFSNodes[2].key).toBe(16);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {BST, BSTNode} from 'bst-typed';
|
|
1
|
+
import {BST, BSTNode, CP} from 'bst-typed';
|
|
2
2
|
|
|
3
3
|
describe('Individual package BST operations test', () => {
|
|
4
4
|
it('should perform various operations on a Binary Search Tree with numeric values', () => {
|
|
@@ -7,7 +7,7 @@ describe('Individual package BST operations test', () => {
|
|
|
7
7
|
bst.add(11, 11);
|
|
8
8
|
bst.add(3, 3);
|
|
9
9
|
const idsOrVals = [15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
|
|
10
|
-
bst.addMany(idsOrVals, idsOrVals);
|
|
10
|
+
bst.addMany(idsOrVals, idsOrVals, false);
|
|
11
11
|
expect(bst.root).toBeInstanceOf(BSTNode);
|
|
12
12
|
|
|
13
13
|
if (bst.root) expect(bst.root.key).toBe(11);
|
|
@@ -23,7 +23,7 @@ describe('Individual package BST operations test', () => {
|
|
|
23
23
|
const nodeId10 = bst.get(10);
|
|
24
24
|
expect(nodeId10?.key).toBe(10);
|
|
25
25
|
|
|
26
|
-
const nodeVal9 = bst.get(9,
|
|
26
|
+
const nodeVal9 = bst.get(9, node => node.val);
|
|
27
27
|
expect(nodeVal9?.key).toBe(9);
|
|
28
28
|
|
|
29
29
|
const leftMost = bst.getLeftMost();
|
|
@@ -33,10 +33,12 @@ describe('Individual package BST operations test', () => {
|
|
|
33
33
|
const minNodeBySpecificNode = node15 && bst.getLeftMost(node15);
|
|
34
34
|
expect(minNodeBySpecificNode?.key).toBe(12);
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
let subTreeSum = 0;
|
|
37
|
+
node15 && bst.subTreeTraverse(node => (subTreeSum += node.key), 15);
|
|
37
38
|
expect(subTreeSum).toBe(70);
|
|
38
39
|
|
|
39
|
-
|
|
40
|
+
let lesserSum = 0;
|
|
41
|
+
bst.lesserOrGreaterTraverse(node => (lesserSum += node.key), CP.lt, 10);
|
|
40
42
|
expect(lesserSum).toBe(45);
|
|
41
43
|
|
|
42
44
|
expect(node15).toBeInstanceOf(BSTNode);
|
|
@@ -44,18 +46,18 @@ describe('Individual package BST operations test', () => {
|
|
|
44
46
|
const node11 = bst.get(11);
|
|
45
47
|
expect(node11).toBeInstanceOf(BSTNode);
|
|
46
48
|
|
|
47
|
-
const dfsInorderNodes = bst.dfs(
|
|
49
|
+
const dfsInorderNodes = bst.dfs(node => node, 'in');
|
|
48
50
|
expect(dfsInorderNodes[0].key).toBe(1);
|
|
49
51
|
expect(dfsInorderNodes[dfsInorderNodes.length - 1].key).toBe(16);
|
|
50
52
|
|
|
51
53
|
bst.perfectlyBalance();
|
|
52
54
|
expect(bst.isPerfectlyBalanced()).toBe(true);
|
|
53
55
|
|
|
54
|
-
const bfsNodesAfterBalanced = bst.bfs(
|
|
56
|
+
const bfsNodesAfterBalanced = bst.bfs(node => node);
|
|
55
57
|
expect(bfsNodesAfterBalanced[0].key).toBe(8);
|
|
56
58
|
expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].key).toBe(16);
|
|
57
59
|
|
|
58
|
-
const removed11 = bst.
|
|
60
|
+
const removed11 = bst.delete(11);
|
|
59
61
|
expect(removed11).toBeInstanceOf(Array);
|
|
60
62
|
expect(removed11[0]).toBeDefined();
|
|
61
63
|
expect(removed11[0].deleted).toBeDefined();
|
|
@@ -66,7 +68,7 @@ describe('Individual package BST operations test', () => {
|
|
|
66
68
|
|
|
67
69
|
expect(bst.getHeight(15)).toBe(1);
|
|
68
70
|
|
|
69
|
-
const removed1 = bst.
|
|
71
|
+
const removed1 = bst.delete(1);
|
|
70
72
|
expect(removed1).toBeInstanceOf(Array);
|
|
71
73
|
expect(removed1[0]).toBeDefined();
|
|
72
74
|
expect(removed1[0].deleted).toBeDefined();
|
|
@@ -76,7 +78,7 @@ describe('Individual package BST operations test', () => {
|
|
|
76
78
|
|
|
77
79
|
expect(bst.getHeight()).toBe(4);
|
|
78
80
|
|
|
79
|
-
const removed4 = bst.
|
|
81
|
+
const removed4 = bst.delete(4);
|
|
80
82
|
expect(removed4).toBeInstanceOf(Array);
|
|
81
83
|
expect(removed4[0]).toBeDefined();
|
|
82
84
|
expect(removed4[0].deleted).toBeDefined();
|
|
@@ -84,7 +86,7 @@ describe('Individual package BST operations test', () => {
|
|
|
84
86
|
expect(bst.isAVLBalanced()).toBe(true);
|
|
85
87
|
expect(bst.getHeight()).toBe(4);
|
|
86
88
|
|
|
87
|
-
const removed10 = bst.
|
|
89
|
+
const removed10 = bst.delete(10);
|
|
88
90
|
expect(removed10).toBeInstanceOf(Array);
|
|
89
91
|
expect(removed10[0]).toBeDefined();
|
|
90
92
|
expect(removed10[0].deleted).toBeDefined();
|
|
@@ -92,7 +94,7 @@ describe('Individual package BST operations test', () => {
|
|
|
92
94
|
expect(bst.isAVLBalanced()).toBe(false);
|
|
93
95
|
expect(bst.getHeight()).toBe(4);
|
|
94
96
|
|
|
95
|
-
const removed15 = bst.
|
|
97
|
+
const removed15 = bst.delete(15);
|
|
96
98
|
expect(removed15).toBeInstanceOf(Array);
|
|
97
99
|
expect(removed15[0]).toBeDefined();
|
|
98
100
|
expect(removed15[0].deleted).toBeDefined();
|
|
@@ -101,7 +103,7 @@ describe('Individual package BST operations test', () => {
|
|
|
101
103
|
expect(bst.isAVLBalanced()).toBe(true);
|
|
102
104
|
expect(bst.getHeight()).toBe(3);
|
|
103
105
|
|
|
104
|
-
const removed5 = bst.
|
|
106
|
+
const removed5 = bst.delete(5);
|
|
105
107
|
expect(removed5).toBeInstanceOf(Array);
|
|
106
108
|
expect(removed5[0]).toBeDefined();
|
|
107
109
|
expect(removed5[0].deleted).toBeDefined();
|
|
@@ -110,7 +112,7 @@ describe('Individual package BST operations test', () => {
|
|
|
110
112
|
expect(bst.isAVLBalanced()).toBe(true);
|
|
111
113
|
expect(bst.getHeight()).toBe(3);
|
|
112
114
|
|
|
113
|
-
const removed13 = bst.
|
|
115
|
+
const removed13 = bst.delete(13);
|
|
114
116
|
expect(removed13).toBeInstanceOf(Array);
|
|
115
117
|
expect(removed13[0]).toBeDefined();
|
|
116
118
|
expect(removed13[0].deleted).toBeDefined();
|
|
@@ -118,7 +120,7 @@ describe('Individual package BST operations test', () => {
|
|
|
118
120
|
expect(bst.isAVLBalanced()).toBe(true);
|
|
119
121
|
expect(bst.getHeight()).toBe(3);
|
|
120
122
|
|
|
121
|
-
const removed3 = bst.
|
|
123
|
+
const removed3 = bst.delete(3);
|
|
122
124
|
expect(removed3).toBeInstanceOf(Array);
|
|
123
125
|
expect(removed3[0]).toBeDefined();
|
|
124
126
|
expect(removed3[0].deleted).toBeDefined();
|
|
@@ -126,7 +128,7 @@ describe('Individual package BST operations test', () => {
|
|
|
126
128
|
expect(bst.isAVLBalanced()).toBe(false);
|
|
127
129
|
expect(bst.getHeight()).toBe(3);
|
|
128
130
|
|
|
129
|
-
const removed8 = bst.
|
|
131
|
+
const removed8 = bst.delete(8);
|
|
130
132
|
expect(removed8).toBeInstanceOf(Array);
|
|
131
133
|
expect(removed8[0]).toBeDefined();
|
|
132
134
|
expect(removed8[0].deleted).toBeDefined();
|
|
@@ -134,16 +136,16 @@ describe('Individual package BST operations test', () => {
|
|
|
134
136
|
expect(bst.isAVLBalanced()).toBe(true);
|
|
135
137
|
expect(bst.getHeight()).toBe(3);
|
|
136
138
|
|
|
137
|
-
const removed6 = bst.
|
|
139
|
+
const removed6 = bst.delete(6);
|
|
138
140
|
expect(removed6).toBeInstanceOf(Array);
|
|
139
141
|
expect(removed6[0]).toBeDefined();
|
|
140
142
|
expect(removed6[0].deleted).toBeDefined();
|
|
141
143
|
if (removed6[0].deleted) expect(removed6[0].deleted.key).toBe(6);
|
|
142
|
-
expect(bst.
|
|
144
|
+
expect(bst.delete(6).length).toBe(0);
|
|
143
145
|
expect(bst.isAVLBalanced()).toBe(false);
|
|
144
146
|
expect(bst.getHeight()).toBe(3);
|
|
145
147
|
|
|
146
|
-
const removed7 = bst.
|
|
148
|
+
const removed7 = bst.delete(7);
|
|
147
149
|
expect(removed7).toBeInstanceOf(Array);
|
|
148
150
|
expect(removed7[0]).toBeDefined();
|
|
149
151
|
expect(removed7[0].deleted).toBeDefined();
|
|
@@ -151,7 +153,7 @@ describe('Individual package BST operations test', () => {
|
|
|
151
153
|
expect(bst.isAVLBalanced()).toBe(false);
|
|
152
154
|
expect(bst.getHeight()).toBe(3);
|
|
153
155
|
|
|
154
|
-
const removed9 = bst.
|
|
156
|
+
const removed9 = bst.delete(9);
|
|
155
157
|
expect(removed9).toBeInstanceOf(Array);
|
|
156
158
|
expect(removed9[0]).toBeDefined();
|
|
157
159
|
expect(removed9[0].deleted).toBeDefined();
|
|
@@ -159,7 +161,7 @@ describe('Individual package BST operations test', () => {
|
|
|
159
161
|
expect(bst.isAVLBalanced()).toBe(false);
|
|
160
162
|
expect(bst.getHeight()).toBe(3);
|
|
161
163
|
|
|
162
|
-
const removed14 = bst.
|
|
164
|
+
const removed14 = bst.delete(14);
|
|
163
165
|
expect(removed14).toBeInstanceOf(Array);
|
|
164
166
|
expect(removed14[0]).toBeDefined();
|
|
165
167
|
expect(removed14[0].deleted).toBeDefined();
|
|
@@ -174,7 +176,7 @@ describe('Individual package BST operations test', () => {
|
|
|
174
176
|
expect(bfsIDs[1]).toBe(12);
|
|
175
177
|
expect(bfsIDs[2]).toBe(16);
|
|
176
178
|
|
|
177
|
-
const bfsNodes = bst.bfs(
|
|
179
|
+
const bfsNodes = bst.bfs(node => node);
|
|
178
180
|
expect(bfsNodes[0].key).toBe(2);
|
|
179
181
|
expect(bfsNodes[1].key).toBe(12);
|
|
180
182
|
expect(bfsNodes[2].key).toBe(16);
|
|
@@ -204,7 +206,8 @@ describe('Individual package BST operations test', () => {
|
|
|
204
206
|
|
|
205
207
|
objBST.addMany(
|
|
206
208
|
values.map(item => item.key),
|
|
207
|
-
values
|
|
209
|
+
values,
|
|
210
|
+
false
|
|
208
211
|
);
|
|
209
212
|
|
|
210
213
|
expect(objBST.root).toBeInstanceOf(BSTNode);
|
|
@@ -217,10 +220,10 @@ describe('Individual package BST operations test', () => {
|
|
|
217
220
|
expect(node6 && objBST.getHeight(node6)).toBe(2);
|
|
218
221
|
expect(node6 && objBST.getDepth(node6)).toBe(3);
|
|
219
222
|
|
|
220
|
-
const nodeId10 = objBST.get(10
|
|
223
|
+
const nodeId10 = objBST.get(10);
|
|
221
224
|
expect(nodeId10?.key).toBe(10);
|
|
222
225
|
|
|
223
|
-
const nodeVal9 = objBST.get(9
|
|
226
|
+
const nodeVal9 = objBST.get(9);
|
|
224
227
|
expect(nodeVal9?.key).toBe(9);
|
|
225
228
|
|
|
226
229
|
const leftMost = objBST.getLeftMost();
|
|
@@ -231,10 +234,12 @@ describe('Individual package BST operations test', () => {
|
|
|
231
234
|
const minNodeBySpecificNode = node15 && objBST.getLeftMost(node15);
|
|
232
235
|
expect(minNodeBySpecificNode?.key).toBe(12);
|
|
233
236
|
|
|
234
|
-
|
|
237
|
+
let subTreeSum = 0;
|
|
238
|
+
node15 && objBST.subTreeTraverse(node => (subTreeSum += node.key), node15);
|
|
235
239
|
expect(subTreeSum).toBe(70);
|
|
236
240
|
|
|
237
|
-
|
|
241
|
+
let lesserSum = 0;
|
|
242
|
+
objBST.lesserOrGreaterTraverse(node => (lesserSum += node.key), CP.lt, 10);
|
|
238
243
|
expect(lesserSum).toBe(45);
|
|
239
244
|
|
|
240
245
|
expect(node15).toBeInstanceOf(BSTNode);
|
|
@@ -242,18 +247,18 @@ describe('Individual package BST operations test', () => {
|
|
|
242
247
|
const node11 = objBST.get(11);
|
|
243
248
|
expect(node11).toBeInstanceOf(BSTNode);
|
|
244
249
|
|
|
245
|
-
const dfsInorderNodes = objBST.dfs(
|
|
250
|
+
const dfsInorderNodes = objBST.dfs(node => node, 'in');
|
|
246
251
|
expect(dfsInorderNodes[0].key).toBe(1);
|
|
247
252
|
expect(dfsInorderNodes[dfsInorderNodes.length - 1].key).toBe(16);
|
|
248
253
|
|
|
249
254
|
objBST.perfectlyBalance();
|
|
250
255
|
expect(objBST.isPerfectlyBalanced()).toBe(true);
|
|
251
256
|
|
|
252
|
-
const bfsNodesAfterBalanced = objBST.bfs(
|
|
257
|
+
const bfsNodesAfterBalanced = objBST.bfs(node => node);
|
|
253
258
|
expect(bfsNodesAfterBalanced[0].key).toBe(8);
|
|
254
259
|
expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].key).toBe(16);
|
|
255
260
|
|
|
256
|
-
const removed11 = objBST.
|
|
261
|
+
const removed11 = objBST.delete(11);
|
|
257
262
|
expect(removed11).toBeInstanceOf(Array);
|
|
258
263
|
expect(removed11[0]).toBeDefined();
|
|
259
264
|
expect(removed11[0].deleted).toBeDefined();
|
|
@@ -264,7 +269,7 @@ describe('Individual package BST operations test', () => {
|
|
|
264
269
|
|
|
265
270
|
expect(node15 && objBST.getHeight(node15)).toBe(2);
|
|
266
271
|
|
|
267
|
-
const removed1 = objBST.
|
|
272
|
+
const removed1 = objBST.delete(1);
|
|
268
273
|
expect(removed1).toBeInstanceOf(Array);
|
|
269
274
|
expect(removed1[0]).toBeDefined();
|
|
270
275
|
expect(removed1[0].deleted).toBeDefined();
|
|
@@ -274,7 +279,7 @@ describe('Individual package BST operations test', () => {
|
|
|
274
279
|
|
|
275
280
|
expect(objBST.getHeight()).toBe(4);
|
|
276
281
|
|
|
277
|
-
const removed4 = objBST.
|
|
282
|
+
const removed4 = objBST.delete(4);
|
|
278
283
|
expect(removed4).toBeInstanceOf(Array);
|
|
279
284
|
expect(removed4[0]).toBeDefined();
|
|
280
285
|
expect(removed4[0].deleted).toBeDefined();
|
|
@@ -282,7 +287,7 @@ describe('Individual package BST operations test', () => {
|
|
|
282
287
|
expect(objBST.isAVLBalanced()).toBe(true);
|
|
283
288
|
expect(objBST.getHeight()).toBe(4);
|
|
284
289
|
|
|
285
|
-
const removed10 = objBST.
|
|
290
|
+
const removed10 = objBST.delete(10);
|
|
286
291
|
expect(removed10).toBeInstanceOf(Array);
|
|
287
292
|
expect(removed10[0]).toBeDefined();
|
|
288
293
|
expect(removed10[0].deleted).toBeDefined();
|
|
@@ -290,7 +295,7 @@ describe('Individual package BST operations test', () => {
|
|
|
290
295
|
expect(objBST.isAVLBalanced()).toBe(false);
|
|
291
296
|
expect(objBST.getHeight()).toBe(4);
|
|
292
297
|
|
|
293
|
-
const removed15 = objBST.
|
|
298
|
+
const removed15 = objBST.delete(15);
|
|
294
299
|
expect(removed15).toBeInstanceOf(Array);
|
|
295
300
|
expect(removed15[0]).toBeDefined();
|
|
296
301
|
expect(removed15[0].deleted).toBeDefined();
|
|
@@ -299,7 +304,7 @@ describe('Individual package BST operations test', () => {
|
|
|
299
304
|
expect(objBST.isAVLBalanced()).toBe(true);
|
|
300
305
|
expect(objBST.getHeight()).toBe(3);
|
|
301
306
|
|
|
302
|
-
const removed5 = objBST.
|
|
307
|
+
const removed5 = objBST.delete(5);
|
|
303
308
|
expect(removed5).toBeInstanceOf(Array);
|
|
304
309
|
expect(removed5[0]).toBeDefined();
|
|
305
310
|
expect(removed5[0].deleted).toBeDefined();
|
|
@@ -308,7 +313,7 @@ describe('Individual package BST operations test', () => {
|
|
|
308
313
|
expect(objBST.isAVLBalanced()).toBe(true);
|
|
309
314
|
expect(objBST.getHeight()).toBe(3);
|
|
310
315
|
|
|
311
|
-
const removed13 = objBST.
|
|
316
|
+
const removed13 = objBST.delete(13);
|
|
312
317
|
expect(removed13).toBeInstanceOf(Array);
|
|
313
318
|
expect(removed13[0]).toBeDefined();
|
|
314
319
|
expect(removed13[0].deleted).toBeDefined();
|
|
@@ -316,7 +321,7 @@ describe('Individual package BST operations test', () => {
|
|
|
316
321
|
expect(objBST.isAVLBalanced()).toBe(true);
|
|
317
322
|
expect(objBST.getHeight()).toBe(3);
|
|
318
323
|
|
|
319
|
-
const removed3 = objBST.
|
|
324
|
+
const removed3 = objBST.delete(3);
|
|
320
325
|
expect(removed3).toBeInstanceOf(Array);
|
|
321
326
|
expect(removed3[0]).toBeDefined();
|
|
322
327
|
expect(removed3[0].deleted).toBeDefined();
|
|
@@ -324,7 +329,7 @@ describe('Individual package BST operations test', () => {
|
|
|
324
329
|
expect(objBST.isAVLBalanced()).toBe(false);
|
|
325
330
|
expect(objBST.getHeight()).toBe(3);
|
|
326
331
|
|
|
327
|
-
const removed8 = objBST.
|
|
332
|
+
const removed8 = objBST.delete(8);
|
|
328
333
|
expect(removed8).toBeInstanceOf(Array);
|
|
329
334
|
expect(removed8[0]).toBeDefined();
|
|
330
335
|
expect(removed8[0].deleted).toBeDefined();
|
|
@@ -332,16 +337,16 @@ describe('Individual package BST operations test', () => {
|
|
|
332
337
|
expect(objBST.isAVLBalanced()).toBe(true);
|
|
333
338
|
expect(objBST.getHeight()).toBe(3);
|
|
334
339
|
|
|
335
|
-
const removed6 = objBST.
|
|
340
|
+
const removed6 = objBST.delete(6);
|
|
336
341
|
expect(removed6).toBeInstanceOf(Array);
|
|
337
342
|
expect(removed6[0]).toBeDefined();
|
|
338
343
|
expect(removed6[0].deleted).toBeDefined();
|
|
339
344
|
if (removed6[0].deleted) expect(removed6[0].deleted.key).toBe(6);
|
|
340
|
-
expect(objBST.
|
|
345
|
+
expect(objBST.delete(6).length).toBe(0);
|
|
341
346
|
expect(objBST.isAVLBalanced()).toBe(false);
|
|
342
347
|
expect(objBST.getHeight()).toBe(3);
|
|
343
348
|
|
|
344
|
-
const removed7 = objBST.
|
|
349
|
+
const removed7 = objBST.delete(7);
|
|
345
350
|
expect(removed7).toBeInstanceOf(Array);
|
|
346
351
|
expect(removed7[0]).toBeDefined();
|
|
347
352
|
expect(removed7[0].deleted).toBeDefined();
|
|
@@ -349,7 +354,7 @@ describe('Individual package BST operations test', () => {
|
|
|
349
354
|
expect(objBST.isAVLBalanced()).toBe(false);
|
|
350
355
|
expect(objBST.getHeight()).toBe(3);
|
|
351
356
|
|
|
352
|
-
const removed9 = objBST.
|
|
357
|
+
const removed9 = objBST.delete(9);
|
|
353
358
|
expect(removed9).toBeInstanceOf(Array);
|
|
354
359
|
expect(removed9[0]).toBeDefined();
|
|
355
360
|
expect(removed9[0].deleted).toBeDefined();
|
|
@@ -357,7 +362,7 @@ describe('Individual package BST operations test', () => {
|
|
|
357
362
|
expect(objBST.isAVLBalanced()).toBe(false);
|
|
358
363
|
expect(objBST.getHeight()).toBe(3);
|
|
359
364
|
|
|
360
|
-
const removed14 = objBST.
|
|
365
|
+
const removed14 = objBST.delete(14);
|
|
361
366
|
expect(removed14).toBeInstanceOf(Array);
|
|
362
367
|
expect(removed14[0]).toBeDefined();
|
|
363
368
|
expect(removed14[0].deleted).toBeDefined();
|
|
@@ -372,7 +377,7 @@ describe('Individual package BST operations test', () => {
|
|
|
372
377
|
expect(bfsIDs[1]).toBe(12);
|
|
373
378
|
expect(bfsIDs[2]).toBe(16);
|
|
374
379
|
|
|
375
|
-
const bfsNodes = objBST.bfs(
|
|
380
|
+
const bfsNodes = objBST.bfs(node => node);
|
|
376
381
|
expect(bfsNodes[0].key).toBe(2);
|
|
377
382
|
expect(bfsNodes[1].key).toBe(12);
|
|
378
383
|
expect(bfsNodes[2].key).toBe(16);
|
|
@@ -144,3 +144,53 @@ describe('BinaryTree', () => {
|
|
|
144
144
|
expect(binaryTree.root).toBeNull();
|
|
145
145
|
});
|
|
146
146
|
});
|
|
147
|
+
|
|
148
|
+
describe('BinaryTree Morris Traversal', () => {
|
|
149
|
+
// Create a binary tree
|
|
150
|
+
const tree = new BinaryTree<BinaryTreeNode<number>>();
|
|
151
|
+
tree.add(1);
|
|
152
|
+
tree.add(2);
|
|
153
|
+
tree.add(3);
|
|
154
|
+
tree.add(4);
|
|
155
|
+
tree.add(5);
|
|
156
|
+
it('should perform in-order Morris traversal correctly as dfs traversal', () => {
|
|
157
|
+
// Perform in-order Morris traversal
|
|
158
|
+
const result = tree.morris(node => node.key, 'in');
|
|
159
|
+
|
|
160
|
+
// Expected in-order traversal result
|
|
161
|
+
const expected = [4, 2, 5, 1, 3];
|
|
162
|
+
|
|
163
|
+
expect(result).toEqual(expected);
|
|
164
|
+
expect(tree.dfs(node => node.key, 'in')).toEqual(expected);
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
it('should perform pre-order Morris traversal correctly as dfs traversal', () => {
|
|
168
|
+
// Perform pre-order Morris traversal
|
|
169
|
+
const result = tree.morris(node => node.key, 'pre');
|
|
170
|
+
|
|
171
|
+
// Expected pre-order traversal result
|
|
172
|
+
const expected = [1, 2, 4, 5, 3];
|
|
173
|
+
|
|
174
|
+
expect(result).toEqual(expected);
|
|
175
|
+
expect(tree.dfs(node => node.key, 'pre')).toEqual(expected);
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
it('should perform post-order Morris traversal correctly as dfs traversal', () => {
|
|
179
|
+
// Perform post-order Morris traversal
|
|
180
|
+
const result = tree.morris(node => node.key, 'post');
|
|
181
|
+
|
|
182
|
+
// Expected post-order traversal result
|
|
183
|
+
const expected = [4, 5, 2, 3, 1];
|
|
184
|
+
|
|
185
|
+
expect(result).toEqual([4, 5, 2, 3, 1]);
|
|
186
|
+
expect(tree.dfs(node => node.key, 'post')).toEqual(expected);
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
it('after morris traversals should the structure of the tree be correct', () => {
|
|
190
|
+
const node1 = tree.get(1);
|
|
191
|
+
const node2 = tree.get(2);
|
|
192
|
+
const node3 = tree.get(3);
|
|
193
|
+
expect(node1?.left).toBe(node2);
|
|
194
|
+
expect(node1?.right).toBe(node3);
|
|
195
|
+
});
|
|
196
|
+
});
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import {BST, BSTNode, CP} from '../../../../src';
|
|
2
|
+
import {isDebugTest} from '../../../config';
|
|
2
3
|
|
|
3
|
-
const isDebug =
|
|
4
|
+
const isDebug = isDebugTest;
|
|
4
5
|
|
|
5
6
|
describe('BST operations test', () => {
|
|
6
7
|
it('should perform various operations on a Binary Search Tree with numeric values', () => {
|
|
@@ -444,4 +445,10 @@ describe('BST Performance test', function () {
|
|
|
444
445
|
isDebug && console.log('---listLevels', arr);
|
|
445
446
|
isDebug && console.log('---listLevels', performance.now() - startL);
|
|
446
447
|
});
|
|
448
|
+
|
|
449
|
+
it('should the lastKey of a BST to be the largest key', function () {
|
|
450
|
+
const bst = new BST();
|
|
451
|
+
bst.addMany([9, 8, 7, 3, 1, 2, 5, 4, 6], undefined, false);
|
|
452
|
+
expect(bst.lastKey()).toBe(9);
|
|
453
|
+
});
|
|
447
454
|
});
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import {CP, TreeMultiset, TreeMultisetNode} from '../../../../src';
|
|
2
|
+
import {isDebugTest} from '../../../config';
|
|
2
3
|
|
|
3
|
-
const isDebug =
|
|
4
|
+
const isDebug = isDebugTest;
|
|
4
5
|
describe('TreeMultiset operations test', () => {
|
|
5
6
|
it('should perform various operations on a Binary Search Tree with numeric values', () => {
|
|
6
7
|
const treeMultiset = new TreeMultiset();
|
package/test/utils/big-o.ts
CHANGED