data-structure-typed 1.41.6 → 1.41.7

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.
Files changed (107) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +11 -11
  3. package/benchmark/report.html +11 -11
  4. package/benchmark/report.json +111 -111
  5. package/dist/cjs/src/data-structures/graph/abstract-graph.js +5 -5
  6. package/dist/cjs/src/data-structures/graph/abstract-graph.js.map +1 -1
  7. package/dist/mjs/src/data-structures/graph/abstract-graph.js +5 -5
  8. package/dist/umd/data-structure-typed.min.js +1 -1
  9. package/dist/umd/data-structure-typed.min.js.map +1 -1
  10. package/package.json +5 -5
  11. package/src/data-structures/graph/abstract-graph.ts +6 -6
  12. package/test/config.ts +1 -0
  13. package/test/integration/avl-tree.test.ts +110 -0
  14. package/test/integration/bst.test.ts +385 -0
  15. package/test/integration/heap.test.js +16 -0
  16. package/test/integration/index.html +51 -0
  17. package/test/performance/data-structures/binary-tree/avl-tree.test.ts +36 -0
  18. package/test/performance/data-structures/binary-tree/binary-index-tree.test.ts +0 -0
  19. package/test/performance/data-structures/binary-tree/binary-tree.test.ts +45 -0
  20. package/test/performance/data-structures/binary-tree/bst.test.ts +36 -0
  21. package/test/performance/data-structures/binary-tree/overall.test.ts +0 -0
  22. package/test/performance/data-structures/binary-tree/rb-tree.test.ts +0 -0
  23. package/test/performance/data-structures/binary-tree/segment-tree.test.ts +0 -0
  24. package/test/performance/data-structures/binary-tree/tree-multiset.test.ts +0 -0
  25. package/test/performance/data-structures/graph/abstract-graph.test.ts +0 -0
  26. package/test/performance/data-structures/graph/directed-graph.test.ts +49 -0
  27. package/test/performance/data-structures/graph/map-graph.test.ts +0 -0
  28. package/test/performance/data-structures/graph/overall.test.ts +0 -0
  29. package/test/performance/data-structures/graph/undirected-graph.test.ts +0 -0
  30. package/test/performance/data-structures/hash/coordinate-map.test.ts +0 -0
  31. package/test/performance/data-structures/hash/coordinate-set.test.ts +0 -0
  32. package/test/performance/data-structures/hash/hash-map.test.ts +0 -0
  33. package/test/performance/data-structures/hash/hash-table.test.ts +0 -0
  34. package/test/performance/data-structures/heap/heap.test.ts +30 -0
  35. package/test/performance/data-structures/heap/max-heap.test.ts +0 -0
  36. package/test/performance/data-structures/heap/min-heap.test.ts +0 -0
  37. package/test/performance/data-structures/linked-list/doubly-linked-list.test.ts +40 -0
  38. package/test/performance/data-structures/linked-list/linked-list.test.ts +0 -0
  39. package/test/performance/data-structures/linked-list/singly-linked-list.test.ts +34 -0
  40. package/test/performance/data-structures/linked-list/skip-linked-list.test.ts +0 -0
  41. package/test/performance/data-structures/linked-list/skip-list.test.ts +0 -0
  42. package/test/performance/data-structures/matrix/matrix.test.ts +0 -0
  43. package/test/performance/data-structures/matrix/matrix2d.test.ts +0 -0
  44. package/test/performance/data-structures/matrix/navigator.test.ts +0 -0
  45. package/test/performance/data-structures/matrix/vector2d.test.ts +0 -0
  46. package/test/performance/data-structures/priority-queue/max-priority-queue.test.ts +19 -0
  47. package/test/performance/data-structures/priority-queue/min-priority-queue.test.ts +0 -0
  48. package/test/performance/data-structures/priority-queue/priority-queue.test.ts +0 -0
  49. package/test/performance/data-structures/queue/deque.test.ts +21 -0
  50. package/test/performance/data-structures/queue/queue.test.ts +25 -0
  51. package/test/performance/data-structures/stack/stack.test.ts +0 -0
  52. package/test/performance/data-structures/tree/tree.test.ts +0 -0
  53. package/test/performance/data-structures/trie/trie.test.ts +22 -0
  54. package/test/performance/reportor.ts +186 -0
  55. package/test/performance/types/index.ts +1 -0
  56. package/test/performance/types/reportor.ts +3 -0
  57. package/test/types/index.ts +1 -0
  58. package/test/types/utils/big-o.ts +1 -0
  59. package/test/types/utils/index.ts +2 -0
  60. package/test/types/utils/json2html.ts +1 -0
  61. package/test/unit/data-structures/binary-tree/avl-tree.test.ts +269 -0
  62. package/test/unit/data-structures/binary-tree/binary-index-tree.test.ts +320 -0
  63. package/test/unit/data-structures/binary-tree/binary-tree.test.ts +486 -0
  64. package/test/unit/data-structures/binary-tree/bst.test.ts +840 -0
  65. package/test/unit/data-structures/binary-tree/overall.test.ts +66 -0
  66. package/test/unit/data-structures/binary-tree/rb-tree.test.ts +435 -0
  67. package/test/unit/data-structures/binary-tree/segment-tree.test.ts +50 -0
  68. package/test/unit/data-structures/binary-tree/tree-multiset.test.ts +542 -0
  69. package/test/unit/data-structures/graph/abstract-graph.test.ts +100 -0
  70. package/test/unit/data-structures/graph/directed-graph.test.ts +564 -0
  71. package/test/unit/data-structures/graph/map-graph.test.ts +126 -0
  72. package/test/unit/data-structures/graph/overall.test.ts +49 -0
  73. package/test/unit/data-structures/graph/salty-edges.json +1 -0
  74. package/test/unit/data-structures/graph/salty-vertexes.json +1 -0
  75. package/test/unit/data-structures/graph/undirected-graph.test.ts +168 -0
  76. package/test/unit/data-structures/hash/coordinate-map.test.ts +74 -0
  77. package/test/unit/data-structures/hash/coordinate-set.test.ts +66 -0
  78. package/test/unit/data-structures/hash/hash-map.test.ts +103 -0
  79. package/test/unit/data-structures/hash/hash-table.test.ts +186 -0
  80. package/test/unit/data-structures/heap/heap.test.ts +254 -0
  81. package/test/unit/data-structures/heap/max-heap.test.ts +52 -0
  82. package/test/unit/data-structures/heap/min-heap.test.ts +52 -0
  83. package/test/unit/data-structures/linked-list/doubly-linked-list.test.ts +400 -0
  84. package/test/unit/data-structures/linked-list/linked-list.test.ts +8 -0
  85. package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +474 -0
  86. package/test/unit/data-structures/linked-list/skip-linked-list.test.ts +13 -0
  87. package/test/unit/data-structures/linked-list/skip-list.test.ts +86 -0
  88. package/test/unit/data-structures/matrix/matrix.test.ts +54 -0
  89. package/test/unit/data-structures/matrix/matrix2d.test.ts +345 -0
  90. package/test/unit/data-structures/matrix/navigator.test.ts +244 -0
  91. package/test/unit/data-structures/matrix/vector2d.test.ts +171 -0
  92. package/test/unit/data-structures/priority-queue/max-priority-queue.test.ts +73 -0
  93. package/test/unit/data-structures/priority-queue/min-priority-queue.test.ts +63 -0
  94. package/test/unit/data-structures/priority-queue/priority-queue.test.ts +53 -0
  95. package/test/unit/data-structures/queue/deque.test.ts +410 -0
  96. package/test/unit/data-structures/queue/queue.test.ts +207 -0
  97. package/test/unit/data-structures/stack/stack.test.ts +67 -0
  98. package/test/unit/data-structures/tree/tree.test.ts +39 -0
  99. package/test/unit/data-structures/trie/trie.test.ts +825 -0
  100. package/test/utils/array.ts +5514 -0
  101. package/test/utils/big-o.ts +207 -0
  102. package/test/utils/console.ts +31 -0
  103. package/test/utils/index.ts +7 -0
  104. package/test/utils/is.ts +56 -0
  105. package/test/utils/json2html.ts +322 -0
  106. package/test/utils/number.ts +13 -0
  107. package/test/utils/string.ts +1 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "data-structure-typed",
3
- "version": "1.41.6",
3
+ "version": "1.41.7",
4
4
  "description": "Data Structures of Javascript & TypeScript. Binary Tree, BST, Graph, Heap, Priority Queue, Linked List, Queue, Deque, Stack, AVL Tree, Tree Multiset, Trie, Directed Graph, Undirected Graph, Singly Linked List, Doubly Linked List, Max Heap, Max Priority Queue, Min Heap, Min Priority Queue.",
5
5
  "main": "dist/cjs/src/index.js",
6
6
  "module": "dist/mjs/src/index.js",
@@ -64,10 +64,10 @@
64
64
  "@typescript-eslint/eslint-plugin": "^6.7.4",
65
65
  "@typescript-eslint/parser": "^6.7.4",
66
66
  "auto-changelog": "^2.4.0",
67
- "avl-tree-typed": "^1.41.2",
67
+ "avl-tree-typed": "^1.41.6",
68
68
  "benchmark": "^2.1.4",
69
- "binary-tree-typed": "^1.41.2",
70
- "bst-typed": "^1.41.2",
69
+ "binary-tree-typed": "^1.41.6",
70
+ "bst-typed": "^1.41.6",
71
71
  "dependency-cruiser": "^14.1.0",
72
72
  "eslint": "^8.50.0",
73
73
  "eslint-config-prettier": "^9.0.0",
@@ -75,7 +75,7 @@
75
75
  "eslint-import-resolver-typescript": "^3.6.1",
76
76
  "eslint-plugin-import": "^2.28.1",
77
77
  "fast-glob": "^3.3.1",
78
- "heap-typed": "^1.41.2",
78
+ "heap-typed": "^1.41.6",
79
79
  "istanbul-badges-readme": "^1.8.5",
80
80
  "jest": "^29.7.0",
81
81
  "prettier": "^3.0.3",
@@ -233,8 +233,8 @@ export abstract class AbstractGraph<
233
233
  return [];
234
234
  }
235
235
 
236
- const dfs = (cur: VO, dest: VO, visiting: Map<VO, boolean>, path: VO[]) => {
237
- visiting.set(cur, true);
236
+ const dfs = (cur: VO, dest: VO, visiting: Set<VO>, path: VO[]) => {
237
+ visiting.add(cur);
238
238
 
239
239
  if (cur === dest) {
240
240
  paths.push([vertex1, ...path]);
@@ -242,17 +242,17 @@ export abstract class AbstractGraph<
242
242
 
243
243
  const neighbors = this.getNeighbors(cur);
244
244
  for (const neighbor of neighbors) {
245
- if (!visiting.get(neighbor)) {
245
+ if (!visiting.has(neighbor)) {
246
246
  path.push(neighbor);
247
247
  dfs(neighbor, dest, visiting, path);
248
- arrayRemove(path, (vertex: VO) => vertex === neighbor);
248
+ path.pop();
249
249
  }
250
250
  }
251
251
 
252
- visiting.set(cur, false);
252
+ visiting.delete(cur);
253
253
  };
254
254
 
255
- dfs(vertex1, vertex2, new Map<VO, boolean>(), []);
255
+ dfs(vertex1, vertex2, new Set<VO>(), []);
256
256
  return paths;
257
257
  }
258
258
 
package/test/config.ts ADDED
@@ -0,0 +1 @@
1
+ export const isDebugTest = false;
@@ -0,0 +1,110 @@
1
+ import {AVLTree, CP} from 'avl-tree-typed';
2
+
3
+ describe('AVL Tree Test', () => {
4
+ it('should perform various operations on a AVL Tree', () => {
5
+ const arr = [11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
6
+ const tree = new AVLTree();
7
+
8
+ for (const i of arr) tree.add(i, i);
9
+
10
+ const node6 = tree.get(6);
11
+
12
+ expect(node6 && tree.getHeight(node6)).toBe(3);
13
+ expect(node6 && tree.getDepth(node6)).toBe(1);
14
+
15
+ const getValueById = tree.get(10);
16
+ expect(getValueById).toBe(10);
17
+
18
+ const getMinNodeByRoot = tree.getLeftMost();
19
+ expect(getMinNodeByRoot?.key).toBe(1);
20
+
21
+ const node15 = tree.getNode(15);
22
+ const getMinNodeBySpecificNode = node15 && tree.getLeftMost(node15);
23
+ expect(getMinNodeBySpecificNode?.key).toBe(12);
24
+
25
+ let subTreeSum = 0;
26
+ node15 && tree.subTreeTraverse(node => (subTreeSum += node.key), 15);
27
+ expect(subTreeSum).toBe(70);
28
+
29
+ let lesserSum = 0;
30
+ tree.lesserOrGreaterTraverse(node => (lesserSum += node.key), CP.lt, 10);
31
+ expect(lesserSum).toBe(45);
32
+
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.
34
+ expect(node15?.value).toBe(15);
35
+
36
+ const dfs = tree.dfs(node => node, 'in');
37
+ expect(dfs[0].key).toBe(1);
38
+ expect(dfs[dfs.length - 1].key).toBe(16);
39
+
40
+ tree.perfectlyBalance();
41
+ const bfs = tree.bfs(node => node);
42
+ expect(tree.isPerfectlyBalanced()).toBe(true);
43
+ expect(bfs[0].key).toBe(8);
44
+ expect(bfs[bfs.length - 1].key).toBe(16);
45
+
46
+ expect(tree.delete(11)[0].deleted?.key).toBe(11);
47
+ expect(tree.isAVLBalanced()).toBe(true);
48
+ expect(node15 && tree.getHeight(node15)).toBe(2);
49
+
50
+ expect(tree.delete(1)[0].deleted?.key).toBe(1);
51
+ expect(tree.isAVLBalanced()).toBe(true);
52
+ expect(tree.getHeight()).toBe(4);
53
+
54
+ expect(tree.delete(4)[0].deleted?.key).toBe(4);
55
+ expect(tree.isAVLBalanced()).toBe(true);
56
+ expect(tree.getHeight()).toBe(4);
57
+
58
+ expect(tree.delete(10)[0].deleted?.key).toBe(10);
59
+ expect(tree.isAVLBalanced()).toBe(true);
60
+ expect(tree.getHeight()).toBe(3);
61
+
62
+ expect(tree.delete(15)[0].deleted?.key).toBe(15);
63
+ expect(tree.isAVLBalanced()).toBe(true);
64
+
65
+ expect(tree.getHeight()).toBe(3);
66
+
67
+ expect(tree.delete(5)[0].deleted?.key).toBe(5);
68
+ expect(tree.isAVLBalanced()).toBe(true);
69
+ expect(tree.getHeight()).toBe(3);
70
+
71
+ expect(tree.delete(13)[0].deleted?.key).toBe(13);
72
+ expect(tree.isAVLBalanced()).toBe(true);
73
+ expect(tree.getHeight()).toBe(3);
74
+
75
+ expect(tree.delete(3)[0].deleted?.key).toBe(3);
76
+ expect(tree.isAVLBalanced()).toBe(true);
77
+ expect(tree.getHeight()).toBe(3);
78
+
79
+ expect(tree.delete(8)[0].deleted?.key).toBe(8);
80
+ expect(tree.isAVLBalanced()).toBe(true);
81
+ expect(tree.getHeight()).toBe(3);
82
+
83
+ expect(tree.delete(6)[0].deleted?.key).toBe(6);
84
+ expect(tree.delete(6).length).toBe(0);
85
+ expect(tree.isAVLBalanced()).toBe(true);
86
+ expect(tree.getHeight()).toBe(2);
87
+
88
+ expect(tree.delete(7)[0].deleted?.key).toBe(7);
89
+ expect(tree.isAVLBalanced()).toBe(true);
90
+ expect(tree.getHeight()).toBe(2);
91
+
92
+ expect(tree.delete(9)[0].deleted?.key).toBe(9);
93
+ expect(tree.isAVLBalanced()).toBe(true);
94
+ expect(tree.getHeight()).toBe(2);
95
+ expect(tree.delete(14)[0].deleted?.key).toBe(14);
96
+ expect(tree.isAVLBalanced()).toBe(true);
97
+ expect(tree.getHeight()).toBe(1);
98
+
99
+ expect(tree.isAVLBalanced()).toBe(true);
100
+ const lastBFSIds = tree.bfs();
101
+ expect(lastBFSIds[0]).toBe(12);
102
+ expect(lastBFSIds[1]).toBe(2);
103
+ expect(lastBFSIds[2]).toBe(16);
104
+
105
+ const lastBFSNodes = tree.bfs(node => node);
106
+ expect(lastBFSNodes[0].key).toBe(12);
107
+ expect(lastBFSNodes[1].key).toBe(2);
108
+ expect(lastBFSNodes[2].key).toBe(16);
109
+ });
110
+ });
@@ -0,0 +1,385 @@
1
+ import {BST, BSTNode, CP} from 'bst-typed';
2
+
3
+ describe('Individual package BST operations test', () => {
4
+ it('should perform various operations on a Binary Search Tree with numeric values', () => {
5
+ const bst = new BST();
6
+ expect(bst).toBeInstanceOf(BST);
7
+ bst.add(11, 11);
8
+ bst.add(3, 3);
9
+ const idsOrValues = [15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
10
+ bst.addMany(idsOrValues, idsOrValues, false);
11
+ expect(bst.root).toBeInstanceOf(BSTNode);
12
+
13
+ if (bst.root) expect(bst.root.key).toBe(11);
14
+
15
+ expect(bst.size).toBe(16);
16
+
17
+ expect(bst.has(6)).toBe(true);
18
+
19
+ const node6 = bst.get(6);
20
+ expect(node6 && bst.getHeight(6)).toBe(2);
21
+ expect(node6 && bst.getDepth(6)).toBe(3);
22
+
23
+ const nodeId10 = bst.getNode(10);
24
+ expect(nodeId10?.key).toBe(10);
25
+
26
+ const nodeVal9 = bst.getNode(9, node => node.value);
27
+ expect(nodeVal9?.key).toBe(9);
28
+
29
+ const leftMost = bst.getLeftMost();
30
+ expect(leftMost?.key).toBe(1);
31
+
32
+ const node15 = bst.getNode(15);
33
+ const minNodeBySpecificNode = node15 && bst.getLeftMost(node15);
34
+ expect(minNodeBySpecificNode?.key).toBe(12);
35
+
36
+ let subTreeSum = 0;
37
+ node15 && bst.subTreeTraverse(node => (subTreeSum += node.key), 15);
38
+ expect(subTreeSum).toBe(70);
39
+
40
+ let lesserSum = 0;
41
+ bst.lesserOrGreaterTraverse(node => (lesserSum += node.key), CP.lt, 10);
42
+ expect(lesserSum).toBe(45);
43
+
44
+ expect(node15).toBeInstanceOf(BSTNode);
45
+
46
+ const node11 = bst.getNode(11);
47
+ expect(node11).toBeInstanceOf(BSTNode);
48
+
49
+ const dfsInorderNodes = bst.dfs(node => node, 'in');
50
+ expect(dfsInorderNodes[0].key).toBe(1);
51
+ expect(dfsInorderNodes[dfsInorderNodes.length - 1].key).toBe(16);
52
+
53
+ bst.perfectlyBalance();
54
+ expect(bst.isPerfectlyBalanced()).toBe(true);
55
+
56
+ const bfsNodesAfterBalanced = bst.bfs(node => node);
57
+ expect(bfsNodesAfterBalanced[0].key).toBe(8);
58
+ expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].key).toBe(16);
59
+
60
+ const removed11 = bst.delete(11);
61
+ expect(removed11).toBeInstanceOf(Array);
62
+ expect(removed11[0]).toBeDefined();
63
+ expect(removed11[0].deleted).toBeDefined();
64
+
65
+ if (removed11[0].deleted) expect(removed11[0].deleted.key).toBe(11);
66
+
67
+ expect(bst.isAVLBalanced()).toBe(true);
68
+
69
+ expect(bst.getHeight(15)).toBe(1);
70
+
71
+ const removed1 = bst.delete(1);
72
+ expect(removed1).toBeInstanceOf(Array);
73
+ expect(removed1[0]).toBeDefined();
74
+ expect(removed1[0].deleted).toBeDefined();
75
+ if (removed1[0].deleted) expect(removed1[0].deleted.key).toBe(1);
76
+
77
+ expect(bst.isAVLBalanced()).toBe(true);
78
+
79
+ expect(bst.getHeight()).toBe(4);
80
+
81
+ const removed4 = bst.delete(4);
82
+ expect(removed4).toBeInstanceOf(Array);
83
+ expect(removed4[0]).toBeDefined();
84
+ expect(removed4[0].deleted).toBeDefined();
85
+ if (removed4[0].deleted) expect(removed4[0].deleted.key).toBe(4);
86
+ expect(bst.isAVLBalanced()).toBe(true);
87
+ expect(bst.getHeight()).toBe(4);
88
+
89
+ const removed10 = bst.delete(10);
90
+ expect(removed10).toBeInstanceOf(Array);
91
+ expect(removed10[0]).toBeDefined();
92
+ expect(removed10[0].deleted).toBeDefined();
93
+ if (removed10[0].deleted) expect(removed10[0].deleted.key).toBe(10);
94
+ expect(bst.isAVLBalanced()).toBe(false);
95
+ expect(bst.getHeight()).toBe(4);
96
+
97
+ const removed15 = bst.delete(15);
98
+ expect(removed15).toBeInstanceOf(Array);
99
+ expect(removed15[0]).toBeDefined();
100
+ expect(removed15[0].deleted).toBeDefined();
101
+ if (removed15[0].deleted) expect(removed15[0].deleted.key).toBe(15);
102
+
103
+ expect(bst.isAVLBalanced()).toBe(true);
104
+ expect(bst.getHeight()).toBe(3);
105
+
106
+ const removed5 = bst.delete(5);
107
+ expect(removed5).toBeInstanceOf(Array);
108
+ expect(removed5[0]).toBeDefined();
109
+ expect(removed5[0].deleted).toBeDefined();
110
+ if (removed5[0].deleted) expect(removed5[0].deleted.key).toBe(5);
111
+
112
+ expect(bst.isAVLBalanced()).toBe(true);
113
+ expect(bst.getHeight()).toBe(3);
114
+
115
+ const removed13 = bst.delete(13);
116
+ expect(removed13).toBeInstanceOf(Array);
117
+ expect(removed13[0]).toBeDefined();
118
+ expect(removed13[0].deleted).toBeDefined();
119
+ if (removed13[0].deleted) expect(removed13[0].deleted.key).toBe(13);
120
+ expect(bst.isAVLBalanced()).toBe(true);
121
+ expect(bst.getHeight()).toBe(3);
122
+
123
+ const removed3 = bst.delete(3);
124
+ expect(removed3).toBeInstanceOf(Array);
125
+ expect(removed3[0]).toBeDefined();
126
+ expect(removed3[0].deleted).toBeDefined();
127
+ if (removed3[0].deleted) expect(removed3[0].deleted.key).toBe(3);
128
+ expect(bst.isAVLBalanced()).toBe(false);
129
+ expect(bst.getHeight()).toBe(3);
130
+
131
+ const removed8 = bst.delete(8);
132
+ expect(removed8).toBeInstanceOf(Array);
133
+ expect(removed8[0]).toBeDefined();
134
+ expect(removed8[0].deleted).toBeDefined();
135
+ if (removed8[0].deleted) expect(removed8[0].deleted.key).toBe(8);
136
+ expect(bst.isAVLBalanced()).toBe(true);
137
+ expect(bst.getHeight()).toBe(3);
138
+
139
+ const removed6 = bst.delete(6);
140
+ expect(removed6).toBeInstanceOf(Array);
141
+ expect(removed6[0]).toBeDefined();
142
+ expect(removed6[0].deleted).toBeDefined();
143
+ if (removed6[0].deleted) expect(removed6[0].deleted.key).toBe(6);
144
+ expect(bst.delete(6).length).toBe(0);
145
+ expect(bst.isAVLBalanced()).toBe(false);
146
+ expect(bst.getHeight()).toBe(3);
147
+
148
+ const removed7 = bst.delete(7);
149
+ expect(removed7).toBeInstanceOf(Array);
150
+ expect(removed7[0]).toBeDefined();
151
+ expect(removed7[0].deleted).toBeDefined();
152
+ if (removed7[0].deleted) expect(removed7[0].deleted.key).toBe(7);
153
+ expect(bst.isAVLBalanced()).toBe(false);
154
+ expect(bst.getHeight()).toBe(3);
155
+
156
+ const removed9 = bst.delete(9);
157
+ expect(removed9).toBeInstanceOf(Array);
158
+ expect(removed9[0]).toBeDefined();
159
+ expect(removed9[0].deleted).toBeDefined();
160
+ if (removed9[0].deleted) expect(removed9[0].deleted.key).toBe(9);
161
+ expect(bst.isAVLBalanced()).toBe(false);
162
+ expect(bst.getHeight()).toBe(3);
163
+
164
+ const removed14 = bst.delete(14);
165
+ expect(removed14).toBeInstanceOf(Array);
166
+ expect(removed14[0]).toBeDefined();
167
+ expect(removed14[0].deleted).toBeDefined();
168
+ if (removed14[0].deleted) expect(removed14[0].deleted.key).toBe(14);
169
+ expect(bst.isAVLBalanced()).toBe(false);
170
+ expect(bst.getHeight()).toBe(2);
171
+
172
+ expect(bst.isAVLBalanced()).toBe(false);
173
+
174
+ const bfsIDs = bst.bfs();
175
+ expect(bfsIDs[0]).toBe(2);
176
+ expect(bfsIDs[1]).toBe(12);
177
+ expect(bfsIDs[2]).toBe(16);
178
+
179
+ const bfsNodes = bst.bfs(node => node);
180
+ expect(bfsNodes[0].key).toBe(2);
181
+ expect(bfsNodes[1].key).toBe(12);
182
+ expect(bfsNodes[2].key).toBe(16);
183
+ });
184
+
185
+ it('should perform various operations on a Binary Search Tree with object values', () => {
186
+ const objBST = new BST<{key: number; keyA: number}>();
187
+ expect(objBST).toBeInstanceOf(BST);
188
+ objBST.add(11, {key: 11, keyA: 11});
189
+ objBST.add(3, {key: 3, keyA: 3});
190
+ const values = [
191
+ {key: 15, keyA: 15},
192
+ {key: 1, keyA: 1},
193
+ {key: 8, keyA: 8},
194
+ {key: 13, keyA: 13},
195
+ {key: 16, keyA: 16},
196
+ {key: 2, keyA: 2},
197
+ {key: 6, keyA: 6},
198
+ {key: 9, keyA: 9},
199
+ {key: 12, keyA: 12},
200
+ {key: 14, keyA: 14},
201
+ {key: 4, keyA: 4},
202
+ {key: 7, keyA: 7},
203
+ {key: 10, keyA: 10},
204
+ {key: 5, keyA: 5}
205
+ ];
206
+
207
+ objBST.addMany(
208
+ values.map(item => item.key),
209
+ values,
210
+ false
211
+ );
212
+
213
+ expect(objBST.root).toBeInstanceOf(BSTNode);
214
+
215
+ if (objBST.root) expect(objBST.root.key).toBe(11);
216
+
217
+ expect(objBST.has(6)).toBe(true);
218
+
219
+ const node6 = objBST.getNode(6);
220
+ expect(node6 && objBST.getHeight(node6)).toBe(2);
221
+ expect(node6 && objBST.getDepth(node6)).toBe(3);
222
+
223
+ const nodeId10 = objBST.get(10);
224
+ expect(nodeId10?.key).toBe(10);
225
+
226
+ const nodeVal9 = objBST.get(9);
227
+ expect(nodeVal9?.key).toBe(9);
228
+
229
+ const leftMost = objBST.getLeftMost();
230
+ expect(leftMost?.key).toBe(1);
231
+
232
+ const node15 = objBST.getNode(15);
233
+ expect(node15?.value).toEqual({key: 15, keyA: 15});
234
+ const minNodeBySpecificNode = node15 && objBST.getLeftMost(node15);
235
+ expect(minNodeBySpecificNode?.key).toBe(12);
236
+
237
+ let subTreeSum = 0;
238
+ node15 && objBST.subTreeTraverse(node => (subTreeSum += node.key), node15);
239
+ expect(subTreeSum).toBe(70);
240
+
241
+ let lesserSum = 0;
242
+ objBST.lesserOrGreaterTraverse(node => (lesserSum += node.key), CP.lt, 10);
243
+ expect(lesserSum).toBe(45);
244
+
245
+ expect(node15).toBeInstanceOf(BSTNode);
246
+
247
+ const node11 = objBST.getNode(11);
248
+ expect(node11).toBeInstanceOf(BSTNode);
249
+
250
+ const dfsInorderNodes = objBST.dfs(node => node, 'in');
251
+ expect(dfsInorderNodes[0].key).toBe(1);
252
+ expect(dfsInorderNodes[dfsInorderNodes.length - 1].key).toBe(16);
253
+
254
+ objBST.perfectlyBalance();
255
+ expect(objBST.isPerfectlyBalanced()).toBe(true);
256
+
257
+ const bfsNodesAfterBalanced = objBST.bfs(node => node);
258
+ expect(bfsNodesAfterBalanced[0].key).toBe(8);
259
+ expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].key).toBe(16);
260
+
261
+ const removed11 = objBST.delete(11);
262
+ expect(removed11).toBeInstanceOf(Array);
263
+ expect(removed11[0]).toBeDefined();
264
+ expect(removed11[0].deleted).toBeDefined();
265
+
266
+ if (removed11[0].deleted) expect(removed11[0].deleted.key).toBe(11);
267
+
268
+ expect(objBST.isAVLBalanced()).toBe(true);
269
+
270
+ expect(node15 && objBST.getHeight(node15)).toBe(2);
271
+
272
+ const removed1 = objBST.delete(1);
273
+ expect(removed1).toBeInstanceOf(Array);
274
+ expect(removed1[0]).toBeDefined();
275
+ expect(removed1[0].deleted).toBeDefined();
276
+ if (removed1[0].deleted) expect(removed1[0].deleted.key).toBe(1);
277
+
278
+ expect(objBST.isAVLBalanced()).toBe(true);
279
+
280
+ expect(objBST.getHeight()).toBe(4);
281
+
282
+ const removed4 = objBST.delete(4);
283
+ expect(removed4).toBeInstanceOf(Array);
284
+ expect(removed4[0]).toBeDefined();
285
+ expect(removed4[0].deleted).toBeDefined();
286
+ if (removed4[0].deleted) expect(removed4[0].deleted.key).toBe(4);
287
+ expect(objBST.isAVLBalanced()).toBe(true);
288
+ expect(objBST.getHeight()).toBe(4);
289
+
290
+ const removed10 = objBST.delete(10);
291
+ expect(removed10).toBeInstanceOf(Array);
292
+ expect(removed10[0]).toBeDefined();
293
+ expect(removed10[0].deleted).toBeDefined();
294
+ if (removed10[0].deleted) expect(removed10[0].deleted.key).toBe(10);
295
+ expect(objBST.isAVLBalanced()).toBe(false);
296
+ expect(objBST.getHeight()).toBe(4);
297
+
298
+ const removed15 = objBST.delete(15);
299
+ expect(removed15).toBeInstanceOf(Array);
300
+ expect(removed15[0]).toBeDefined();
301
+ expect(removed15[0].deleted).toBeDefined();
302
+ if (removed15[0].deleted) expect(removed15[0].deleted.key).toBe(15);
303
+
304
+ expect(objBST.isAVLBalanced()).toBe(true);
305
+ expect(objBST.getHeight()).toBe(3);
306
+
307
+ const removed5 = objBST.delete(5);
308
+ expect(removed5).toBeInstanceOf(Array);
309
+ expect(removed5[0]).toBeDefined();
310
+ expect(removed5[0].deleted).toBeDefined();
311
+ if (removed5[0].deleted) expect(removed5[0].deleted.key).toBe(5);
312
+
313
+ expect(objBST.isAVLBalanced()).toBe(true);
314
+ expect(objBST.getHeight()).toBe(3);
315
+
316
+ const removed13 = objBST.delete(13);
317
+ expect(removed13).toBeInstanceOf(Array);
318
+ expect(removed13[0]).toBeDefined();
319
+ expect(removed13[0].deleted).toBeDefined();
320
+ if (removed13[0].deleted) expect(removed13[0].deleted.key).toBe(13);
321
+ expect(objBST.isAVLBalanced()).toBe(true);
322
+ expect(objBST.getHeight()).toBe(3);
323
+
324
+ const removed3 = objBST.delete(3);
325
+ expect(removed3).toBeInstanceOf(Array);
326
+ expect(removed3[0]).toBeDefined();
327
+ expect(removed3[0].deleted).toBeDefined();
328
+ if (removed3[0].deleted) expect(removed3[0].deleted.key).toBe(3);
329
+ expect(objBST.isAVLBalanced()).toBe(false);
330
+ expect(objBST.getHeight()).toBe(3);
331
+
332
+ const removed8 = objBST.delete(8);
333
+ expect(removed8).toBeInstanceOf(Array);
334
+ expect(removed8[0]).toBeDefined();
335
+ expect(removed8[0].deleted).toBeDefined();
336
+ if (removed8[0].deleted) expect(removed8[0].deleted.key).toBe(8);
337
+ expect(objBST.isAVLBalanced()).toBe(true);
338
+ expect(objBST.getHeight()).toBe(3);
339
+
340
+ const removed6 = objBST.delete(6);
341
+ expect(removed6).toBeInstanceOf(Array);
342
+ expect(removed6[0]).toBeDefined();
343
+ expect(removed6[0].deleted).toBeDefined();
344
+ if (removed6[0].deleted) expect(removed6[0].deleted.key).toBe(6);
345
+ expect(objBST.delete(6).length).toBe(0);
346
+ expect(objBST.isAVLBalanced()).toBe(false);
347
+ expect(objBST.getHeight()).toBe(3);
348
+
349
+ const removed7 = objBST.delete(7);
350
+ expect(removed7).toBeInstanceOf(Array);
351
+ expect(removed7[0]).toBeDefined();
352
+ expect(removed7[0].deleted).toBeDefined();
353
+ if (removed7[0].deleted) expect(removed7[0].deleted.key).toBe(7);
354
+ expect(objBST.isAVLBalanced()).toBe(false);
355
+ expect(objBST.getHeight()).toBe(3);
356
+
357
+ const removed9 = objBST.delete(9);
358
+ expect(removed9).toBeInstanceOf(Array);
359
+ expect(removed9[0]).toBeDefined();
360
+ expect(removed9[0].deleted).toBeDefined();
361
+ if (removed9[0].deleted) expect(removed9[0].deleted.key).toBe(9);
362
+ expect(objBST.isAVLBalanced()).toBe(false);
363
+ expect(objBST.getHeight()).toBe(3);
364
+
365
+ const removed14 = objBST.delete(14);
366
+ expect(removed14).toBeInstanceOf(Array);
367
+ expect(removed14[0]).toBeDefined();
368
+ expect(removed14[0].deleted).toBeDefined();
369
+ if (removed14[0].deleted) expect(removed14[0].deleted.key).toBe(14);
370
+ expect(objBST.isAVLBalanced()).toBe(false);
371
+ expect(objBST.getHeight()).toBe(2);
372
+
373
+ expect(objBST.isAVLBalanced()).toBe(false);
374
+
375
+ const bfsIDs = objBST.bfs();
376
+ expect(bfsIDs[0]).toBe(2);
377
+ expect(bfsIDs[1]).toBe(12);
378
+ expect(bfsIDs[2]).toBe(16);
379
+
380
+ const bfsNodes = objBST.bfs(node => node);
381
+ expect(bfsNodes[0].key).toBe(2);
382
+ expect(bfsNodes[1].key).toBe(12);
383
+ expect(bfsNodes[2].key).toBe(16);
384
+ });
385
+ });
@@ -0,0 +1,16 @@
1
+ const {MinHeap} = require('heap-typed');
2
+
3
+ describe('JS Heap Operation Test', () => {
4
+ it('should numeric heap work well', function () {
5
+ const minNumHeap = new MinHeap();
6
+ minNumHeap.add(1).add(6).add(2).add(0).add(5).add(9);
7
+ expect(minNumHeap.poll()).toBe(0);
8
+ expect(minNumHeap.poll()).toBe(1);
9
+ expect(minNumHeap.peek()).toBe(2);
10
+ expect(minNumHeap.toArray().length).toBe(4);
11
+ expect(minNumHeap.toArray()[0]).toBe(2);
12
+ expect(minNumHeap.toArray()[1]).toBe(5);
13
+ expect(minNumHeap.toArray()[2]).toBe(9);
14
+ expect(minNumHeap.toArray()[3]).toBe(6);
15
+ });
16
+ });
@@ -0,0 +1,51 @@
1
+ <!DOCTYPE html>
2
+ <html lang='en'>
3
+ <head>
4
+ <meta charset='UTF-8'>
5
+ <title>CDN Test</title>
6
+ <script src='https://cdn.jsdelivr.net/npm/data-structure-typed/dist/umd/data-structure-typed.min.js'></script>
7
+ </head>
8
+ <body>
9
+ <div id='app'>
10
+ <ul class='modules'>
11
+
12
+ </ul>
13
+ </div>
14
+ <script defer>
15
+ const $modules = document.querySelector('.modules');
16
+
17
+
18
+ try {
19
+ const {AVLTree, Queue} = window.dataStructureTyped;
20
+ const avlTree = new AVLTree();
21
+ const $avlTree = document.createElement('li');
22
+ const $avlTreeSpan = document.createElement('span');
23
+ $avlTreeSpan.innerText = 'AVLTree';
24
+ $avlTree.append($avlTreeSpan);
25
+ avlTree.add(1, 1);
26
+ console.log(avlTree.bfs());
27
+ $modules.append($avlTree);
28
+
29
+
30
+ const queue = new Queue();
31
+ for (let i = 0; i < 1000000; i++) {
32
+ queue.enqueue(i);
33
+ }
34
+ let last = 0;
35
+ const startTime = performance.now();
36
+
37
+ for (let i = 0; i < 1000000; i++) {
38
+ last = queue.dequeue();
39
+ }
40
+
41
+ console.log(performance.now() - startTime);
42
+
43
+ } catch (e) {
44
+ console.error(e);
45
+ }
46
+
47
+ </script>
48
+
49
+ </body>
50
+ </html>
51
+
@@ -0,0 +1,36 @@
1
+ import {AVLTree} from '../../../../src';
2
+ import * as Benchmark from 'benchmark';
3
+ import {getRandomIntArray, magnitude} from '../../../utils';
4
+
5
+ const suite = new Benchmark.Suite();
6
+ const avl = new AVLTree<number>();
7
+ const {N_LOG_N} = magnitude;
8
+ const arr = getRandomIntArray(N_LOG_N, 0, N_LOG_N, true);
9
+
10
+ suite
11
+ .add(`${N_LOG_N} add randomly`, () => {
12
+ avl.clear();
13
+ for (let i = 0; i < arr.length; i++) {
14
+ avl.add(arr[i]);
15
+ }
16
+ })
17
+ .add(`${N_LOG_N} add & delete randomly`, () => {
18
+ avl.clear();
19
+ for (let i = 0; i < arr.length; i++) {
20
+ avl.add(arr[i]);
21
+ }
22
+ for (let i = 0; i < arr.length; i++) {
23
+ avl.delete(arr[i]);
24
+ }
25
+ })
26
+ .add(`${N_LOG_N} addMany`, () => {
27
+ avl.clear();
28
+ avl.addMany(arr);
29
+ })
30
+ .add(`${N_LOG_N} get`, () => {
31
+ for (let i = 0; i < arr.length; i++) {
32
+ avl.get(arr[i]);
33
+ }
34
+ });
35
+
36
+ export {suite};