data-structure-typed 1.41.6 → 1.41.8

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 (115) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +14 -11
  3. package/benchmark/report.html +14 -11
  4. package/benchmark/report.json +153 -202
  5. package/dist/cjs/src/data-structures/binary-tree/rb-tree.d.ts +5 -2
  6. package/dist/cjs/src/data-structures/binary-tree/rb-tree.js +15 -2
  7. package/dist/cjs/src/data-structures/binary-tree/rb-tree.js.map +1 -1
  8. package/dist/cjs/src/data-structures/graph/abstract-graph.js +5 -5
  9. package/dist/cjs/src/data-structures/graph/abstract-graph.js.map +1 -1
  10. package/dist/mjs/src/data-structures/binary-tree/rb-tree.d.ts +5 -2
  11. package/dist/mjs/src/data-structures/binary-tree/rb-tree.js +15 -2
  12. package/dist/mjs/src/data-structures/graph/abstract-graph.js +5 -5
  13. package/dist/umd/data-structure-typed.min.js +1 -1
  14. package/dist/umd/data-structure-typed.min.js.map +1 -1
  15. package/package.json +5 -5
  16. package/src/data-structures/binary-tree/binary-tree.ts +1 -1
  17. package/src/data-structures/binary-tree/bst.ts +1 -1
  18. package/src/data-structures/binary-tree/rb-tree.ts +18 -2
  19. package/src/data-structures/graph/abstract-graph.ts +6 -6
  20. package/test/config.ts +1 -0
  21. package/test/integration/avl-tree.test.ts +110 -0
  22. package/test/integration/bst.test.ts +385 -0
  23. package/test/integration/heap.test.js +16 -0
  24. package/test/integration/index.html +51 -0
  25. package/test/performance/data-structures/binary-tree/avl-tree.test.ts +36 -0
  26. package/test/performance/data-structures/binary-tree/binary-index-tree.test.ts +0 -0
  27. package/test/performance/data-structures/binary-tree/binary-tree.test.ts +45 -0
  28. package/test/performance/data-structures/binary-tree/bst.test.ts +36 -0
  29. package/test/performance/data-structures/binary-tree/overall.test.ts +0 -0
  30. package/test/performance/data-structures/binary-tree/rb-tree.test.ts +32 -0
  31. package/test/performance/data-structures/binary-tree/segment-tree.test.ts +0 -0
  32. package/test/performance/data-structures/binary-tree/tree-multiset.test.ts +0 -0
  33. package/test/performance/data-structures/graph/abstract-graph.test.ts +0 -0
  34. package/test/performance/data-structures/graph/directed-graph.test.ts +49 -0
  35. package/test/performance/data-structures/graph/map-graph.test.ts +0 -0
  36. package/test/performance/data-structures/graph/overall.test.ts +0 -0
  37. package/test/performance/data-structures/graph/undirected-graph.test.ts +0 -0
  38. package/test/performance/data-structures/hash/coordinate-map.test.ts +0 -0
  39. package/test/performance/data-structures/hash/coordinate-set.test.ts +0 -0
  40. package/test/performance/data-structures/hash/hash-map.test.ts +0 -0
  41. package/test/performance/data-structures/hash/hash-table.test.ts +0 -0
  42. package/test/performance/data-structures/heap/heap.test.ts +30 -0
  43. package/test/performance/data-structures/heap/max-heap.test.ts +0 -0
  44. package/test/performance/data-structures/heap/min-heap.test.ts +0 -0
  45. package/test/performance/data-structures/linked-list/doubly-linked-list.test.ts +40 -0
  46. package/test/performance/data-structures/linked-list/linked-list.test.ts +0 -0
  47. package/test/performance/data-structures/linked-list/singly-linked-list.test.ts +34 -0
  48. package/test/performance/data-structures/linked-list/skip-linked-list.test.ts +0 -0
  49. package/test/performance/data-structures/linked-list/skip-list.test.ts +0 -0
  50. package/test/performance/data-structures/matrix/matrix.test.ts +0 -0
  51. package/test/performance/data-structures/matrix/matrix2d.test.ts +0 -0
  52. package/test/performance/data-structures/matrix/navigator.test.ts +0 -0
  53. package/test/performance/data-structures/matrix/vector2d.test.ts +0 -0
  54. package/test/performance/data-structures/priority-queue/max-priority-queue.test.ts +19 -0
  55. package/test/performance/data-structures/priority-queue/min-priority-queue.test.ts +0 -0
  56. package/test/performance/data-structures/priority-queue/priority-queue.test.ts +0 -0
  57. package/test/performance/data-structures/queue/deque.test.ts +21 -0
  58. package/test/performance/data-structures/queue/queue.test.ts +25 -0
  59. package/test/performance/data-structures/stack/stack.test.ts +0 -0
  60. package/test/performance/data-structures/tree/tree.test.ts +0 -0
  61. package/test/performance/data-structures/trie/trie.test.ts +22 -0
  62. package/test/performance/reportor.ts +185 -0
  63. package/test/performance/types/index.ts +1 -0
  64. package/test/performance/types/reportor.ts +3 -0
  65. package/test/types/index.ts +1 -0
  66. package/test/types/utils/big-o.ts +1 -0
  67. package/test/types/utils/index.ts +2 -0
  68. package/test/types/utils/json2html.ts +1 -0
  69. package/test/unit/data-structures/binary-tree/avl-tree.test.ts +269 -0
  70. package/test/unit/data-structures/binary-tree/binary-index-tree.test.ts +320 -0
  71. package/test/unit/data-structures/binary-tree/binary-tree.test.ts +486 -0
  72. package/test/unit/data-structures/binary-tree/bst.test.ts +840 -0
  73. package/test/unit/data-structures/binary-tree/overall.test.ts +66 -0
  74. package/test/unit/data-structures/binary-tree/rb-tree.test.ts +435 -0
  75. package/test/unit/data-structures/binary-tree/segment-tree.test.ts +50 -0
  76. package/test/unit/data-structures/binary-tree/tree-multiset.test.ts +542 -0
  77. package/test/unit/data-structures/graph/abstract-graph.test.ts +100 -0
  78. package/test/unit/data-structures/graph/directed-graph.test.ts +564 -0
  79. package/test/unit/data-structures/graph/map-graph.test.ts +126 -0
  80. package/test/unit/data-structures/graph/overall.test.ts +49 -0
  81. package/test/unit/data-structures/graph/salty-edges.json +1 -0
  82. package/test/unit/data-structures/graph/salty-vertexes.json +1 -0
  83. package/test/unit/data-structures/graph/undirected-graph.test.ts +167 -0
  84. package/test/unit/data-structures/hash/coordinate-map.test.ts +74 -0
  85. package/test/unit/data-structures/hash/coordinate-set.test.ts +66 -0
  86. package/test/unit/data-structures/hash/hash-map.test.ts +103 -0
  87. package/test/unit/data-structures/hash/hash-table.test.ts +186 -0
  88. package/test/unit/data-structures/heap/heap.test.ts +254 -0
  89. package/test/unit/data-structures/heap/max-heap.test.ts +52 -0
  90. package/test/unit/data-structures/heap/min-heap.test.ts +52 -0
  91. package/test/unit/data-structures/linked-list/doubly-linked-list.test.ts +400 -0
  92. package/test/unit/data-structures/linked-list/linked-list.test.ts +8 -0
  93. package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +474 -0
  94. package/test/unit/data-structures/linked-list/skip-linked-list.test.ts +13 -0
  95. package/test/unit/data-structures/linked-list/skip-list.test.ts +86 -0
  96. package/test/unit/data-structures/matrix/matrix.test.ts +54 -0
  97. package/test/unit/data-structures/matrix/matrix2d.test.ts +345 -0
  98. package/test/unit/data-structures/matrix/navigator.test.ts +244 -0
  99. package/test/unit/data-structures/matrix/vector2d.test.ts +171 -0
  100. package/test/unit/data-structures/priority-queue/max-priority-queue.test.ts +73 -0
  101. package/test/unit/data-structures/priority-queue/min-priority-queue.test.ts +63 -0
  102. package/test/unit/data-structures/priority-queue/priority-queue.test.ts +53 -0
  103. package/test/unit/data-structures/queue/deque.test.ts +410 -0
  104. package/test/unit/data-structures/queue/queue.test.ts +207 -0
  105. package/test/unit/data-structures/stack/stack.test.ts +67 -0
  106. package/test/unit/data-structures/tree/tree.test.ts +39 -0
  107. package/test/unit/data-structures/trie/trie.test.ts +825 -0
  108. package/test/utils/array.ts +5514 -0
  109. package/test/utils/big-o.ts +207 -0
  110. package/test/utils/console.ts +31 -0
  111. package/test/utils/index.ts +7 -0
  112. package/test/utils/is.ts +56 -0
  113. package/test/utils/json2html.ts +322 -0
  114. package/test/utils/number.ts +13 -0
  115. 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.8",
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",
@@ -142,7 +142,7 @@ export class BinaryTree<V = any, N extends BinaryTreeNode<V, N> = BinaryTreeNode
142
142
  }
143
143
 
144
144
  protected defaultOneParamCallback = (node: N) => node.key;
145
-
145
+
146
146
  /**
147
147
  * Creates a new instance of BinaryTreeNode with the given key and value.
148
148
  * @param {BTNKey} key - The key for the new node.
@@ -36,7 +36,7 @@ export class BST<V = any, N extends BSTNode<V, N> = BSTNode<V, BSTNodeNested<V>>
36
36
  }
37
37
  }
38
38
  }
39
-
39
+
40
40
  /**
41
41
  * The function creates a new binary search tree node with the given key and value.
42
42
  * @param {BTNKey} key - The key parameter is the key value that will be associated with
@@ -44,6 +44,12 @@ export class RedBlackTree {
44
44
  return this._root;
45
45
  }
46
46
 
47
+ protected _size: number = 0;
48
+
49
+ get size(): number {
50
+ return this._size;
51
+ }
52
+
47
53
  /**
48
54
  * The `insert` function inserts a new node with a given key into a red-black tree and fixes any
49
55
  * violations of the red-black tree properties.
@@ -51,7 +57,7 @@ export class RedBlackTree {
51
57
  * the RBTree.
52
58
  * @returns The function does not explicitly return anything.
53
59
  */
54
- insert(key: number): void {
60
+ add(key: number): void {
55
61
  const node: RBTreeNode = new RBTreeNode(key, RBTNColor.RED);
56
62
  node.left = NIL;
57
63
  node.right = NIL;
@@ -79,20 +85,23 @@ export class RedBlackTree {
79
85
 
80
86
  if (node.parent === null) {
81
87
  node.color = RBTNColor.BLACK;
88
+ this._size++;
82
89
  return;
83
90
  }
84
91
 
85
92
  if (node.parent.parent === null) {
93
+ this._size++;
86
94
  return;
87
95
  }
88
96
 
89
97
  this._fixInsert(node);
98
+ this._size++;
90
99
  }
91
100
 
92
101
  /**
93
102
  * The `delete` function in TypeScript is used to remove a node with a specific key from a red-black
94
103
  * tree.
95
- * @param {RBTreeNode} node - The `node` parameter is of type `RBTreeNode` and represents the current
104
+ * @param {number} key - The `node` parameter is of type `RBTreeNode` and represents the current
96
105
  * node being processed in the delete operation.
97
106
  * @returns The `delete` function does not return anything. It has a return type of `void`.
98
107
  */
@@ -113,6 +122,7 @@ export class RedBlackTree {
113
122
  }
114
123
 
115
124
  if (z === NIL) {
125
+ this._size--;
116
126
  return;
117
127
  }
118
128
 
@@ -144,6 +154,7 @@ export class RedBlackTree {
144
154
  if (yOriginalColor === RBTNColor.BLACK) {
145
155
  this._fixDelete(x);
146
156
  }
157
+ this._size--;
147
158
  };
148
159
  helper(this.root);
149
160
  }
@@ -241,6 +252,11 @@ export class RedBlackTree {
241
252
  return y;
242
253
  }
243
254
 
255
+ clear() {
256
+ this._root = NIL;
257
+ this._size = 0;
258
+ }
259
+
244
260
  print(beginRoot: RBTreeNode = this.root) {
245
261
  const display = (root: RBTreeNode | null): void => {
246
262
  const [lines, , ,] = _displayAux(root);
@@ -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
+ });