data-structure-typed 2.2.7 → 2.3.0

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 (181) hide show
  1. package/.github/workflows/ci.yml +9 -0
  2. package/CHANGELOG.md +1 -1
  3. package/README.md +14 -3
  4. package/README_CN.md +119 -275
  5. package/benchmark/report.html +1 -1
  6. package/benchmark/report.json +20 -324
  7. package/dist/cjs/index.cjs +689 -182
  8. package/dist/cjs/index.cjs.map +1 -1
  9. package/dist/cjs-legacy/index.cjs +693 -185
  10. package/dist/cjs-legacy/index.cjs.map +1 -1
  11. package/dist/esm/index.mjs +689 -182
  12. package/dist/esm/index.mjs.map +1 -1
  13. package/dist/esm-legacy/index.mjs +693 -185
  14. package/dist/esm-legacy/index.mjs.map +1 -1
  15. package/dist/leetcode/avl-tree-counter.mjs +2957 -0
  16. package/dist/leetcode/avl-tree-multi-map.mjs +2889 -0
  17. package/dist/leetcode/avl-tree.mjs +2720 -0
  18. package/dist/leetcode/binary-tree.mjs +1594 -0
  19. package/dist/leetcode/bst.mjs +2398 -0
  20. package/dist/leetcode/deque.mjs +683 -0
  21. package/dist/leetcode/directed-graph.mjs +1733 -0
  22. package/dist/leetcode/doubly-linked-list.mjs +709 -0
  23. package/dist/leetcode/hash-map.mjs +493 -0
  24. package/dist/leetcode/heap.mjs +542 -0
  25. package/dist/leetcode/max-heap.mjs +375 -0
  26. package/dist/leetcode/max-priority-queue.mjs +383 -0
  27. package/dist/leetcode/min-heap.mjs +363 -0
  28. package/dist/leetcode/min-priority-queue.mjs +371 -0
  29. package/dist/leetcode/priority-queue.mjs +363 -0
  30. package/dist/leetcode/queue.mjs +943 -0
  31. package/dist/leetcode/red-black-tree.mjs +2765 -0
  32. package/dist/leetcode/singly-linked-list.mjs +754 -0
  33. package/dist/leetcode/stack.mjs +217 -0
  34. package/dist/leetcode/tree-counter.mjs +3039 -0
  35. package/dist/leetcode/tree-multi-map.mjs +2913 -0
  36. package/dist/leetcode/trie.mjs +413 -0
  37. package/dist/leetcode/undirected-graph.mjs +1650 -0
  38. package/dist/types/data-structures/base/linear-base.d.ts +6 -6
  39. package/dist/types/data-structures/binary-tree/avl-tree-counter.d.ts +1 -1
  40. package/dist/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +2 -2
  41. package/dist/types/data-structures/binary-tree/avl-tree.d.ts +10 -10
  42. package/dist/types/data-structures/binary-tree/binary-tree.d.ts +25 -27
  43. package/dist/types/data-structures/binary-tree/bst.d.ts +13 -12
  44. package/dist/types/data-structures/binary-tree/red-black-tree.d.ts +151 -21
  45. package/dist/types/data-structures/binary-tree/tree-counter.d.ts +4 -4
  46. package/dist/types/data-structures/binary-tree/tree-multi-map.d.ts +2 -2
  47. package/dist/types/interfaces/binary-tree.d.ts +1 -1
  48. package/dist/umd/data-structure-typed.js +689 -181
  49. package/dist/umd/data-structure-typed.js.map +1 -1
  50. package/dist/umd/data-structure-typed.min.js +3 -3
  51. package/dist/umd/data-structure-typed.min.js.map +1 -1
  52. package/package.json +50 -172
  53. package/src/data-structures/base/linear-base.ts +2 -12
  54. package/src/data-structures/binary-tree/avl-tree-counter.ts +6 -6
  55. package/src/data-structures/binary-tree/avl-tree-multi-map.ts +13 -13
  56. package/src/data-structures/binary-tree/avl-tree.ts +15 -15
  57. package/src/data-structures/binary-tree/binary-tree.ts +57 -60
  58. package/src/data-structures/binary-tree/bst.ts +100 -26
  59. package/src/data-structures/binary-tree/red-black-tree.ts +586 -76
  60. package/src/data-structures/binary-tree/tree-counter.ts +25 -13
  61. package/src/data-structures/binary-tree/tree-multi-map.ts +13 -13
  62. package/src/data-structures/queue/deque.ts +10 -0
  63. package/src/interfaces/binary-tree.ts +1 -1
  64. package/test/performance/data-structures/binary-tree/red-black-tree.test.ts +1 -2
  65. package/test/unit/data-structures/base/iterable-element-base.coverage.test.ts +106 -0
  66. package/test/unit/data-structures/base/iterable-element-base.more-branches.coverage.test.ts +61 -0
  67. package/test/unit/data-structures/base/linear-base.array.coverage.test.ts +168 -0
  68. package/test/unit/data-structures/base/linear-base.concat-else.coverage.test.ts +82 -0
  69. package/test/unit/data-structures/base/linear-base.coverage.test.ts +72 -0
  70. package/test/unit/data-structures/base/linear-base.more-branches.coverage.test.ts +417 -0
  71. package/test/unit/data-structures/binary-tree/avl-tree-counter.more-branches-3.coverage.test.ts +146 -0
  72. package/test/unit/data-structures/binary-tree/avl-tree-counter.more-branches.coverage.test.ts +93 -0
  73. package/test/unit/data-structures/binary-tree/avl-tree-counter.test.ts +30 -30
  74. package/test/unit/data-structures/binary-tree/avl-tree-multi-map.coverage.test.ts +108 -0
  75. package/test/unit/data-structures/binary-tree/avl-tree-multi-map.more-branches-2.coverage.test.ts +85 -0
  76. package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +46 -46
  77. package/test/unit/data-structures/binary-tree/avl-tree-node.familyPosition-root-left.coverage.test.ts +17 -0
  78. package/test/unit/data-structures/binary-tree/avl-tree.more-branches-2.coverage.test.ts +99 -0
  79. package/test/unit/data-structures/binary-tree/avl-tree.test.ts +43 -43
  80. package/test/unit/data-structures/binary-tree/binary-indexed-tree.more-branches.coverage.test.ts +18 -0
  81. package/test/unit/data-structures/binary-tree/binary-tree.more-branches.coverage.test.ts +56 -0
  82. package/test/unit/data-structures/binary-tree/binary-tree.remaining-branches.coverage.test.ts +229 -0
  83. package/test/unit/data-structures/binary-tree/binary-tree.test.ts +151 -151
  84. package/test/unit/data-structures/binary-tree/bst.bound-by-predicate.coverage.test.ts +33 -0
  85. package/test/unit/data-structures/binary-tree/bst.coverage.test.ts +94 -0
  86. package/test/unit/data-structures/binary-tree/bst.deletebykey.coverage.test.ts +70 -0
  87. package/test/unit/data-structures/binary-tree/bst.deletewhere.coverage.test.ts +37 -0
  88. package/test/unit/data-structures/binary-tree/bst.floor-lower-predicate.coverage.test.ts +29 -0
  89. package/test/unit/data-structures/binary-tree/bst.floor-setmany.coverage.test.ts +72 -0
  90. package/test/unit/data-structures/binary-tree/bst.getnode.range-ensure.coverage.test.ts +22 -0
  91. package/test/unit/data-structures/binary-tree/bst.misc-branches.coverage.test.ts +100 -0
  92. package/test/unit/data-structures/binary-tree/bst.more-branches-2.coverage.test.ts +133 -0
  93. package/test/unit/data-structures/binary-tree/bst.more-branches-3.coverage.test.ts +45 -0
  94. package/test/unit/data-structures/binary-tree/bst.more-branches-4.coverage.test.ts +36 -0
  95. package/test/unit/data-structures/binary-tree/bst.more-branches-5.coverage.test.ts +40 -0
  96. package/test/unit/data-structures/binary-tree/bst.more.coverage.test.ts +39 -0
  97. package/test/unit/data-structures/binary-tree/bst.node-family.coverage.test.ts +29 -0
  98. package/test/unit/data-structures/binary-tree/bst.range-pruning.coverage.test.ts +43 -0
  99. package/test/unit/data-structures/binary-tree/bst.search-fastpath.coverage.test.ts +30 -0
  100. package/test/unit/data-structures/binary-tree/bst.test.ts +124 -154
  101. package/test/unit/data-structures/binary-tree/overall.test.ts +20 -20
  102. package/test/unit/data-structures/binary-tree/red-black-tree.boundary-corruption-repair.coverage.test.ts +66 -0
  103. package/test/unit/data-structures/binary-tree/red-black-tree.boundary-max-update.coverage.test.ts +18 -0
  104. package/test/unit/data-structures/binary-tree/red-black-tree.boundary-null.coverage.test.ts +53 -0
  105. package/test/unit/data-structures/binary-tree/red-black-tree.boundary-stale-cache.coverage.test.ts +25 -0
  106. package/test/unit/data-structures/binary-tree/red-black-tree.boundary-update.coverage.test.ts +23 -0
  107. package/test/unit/data-structures/binary-tree/red-black-tree.cache-delete.coverage.test.ts +49 -0
  108. package/test/unit/data-structures/binary-tree/red-black-tree.cache-edge.coverage.test.ts +37 -0
  109. package/test/unit/data-structures/binary-tree/red-black-tree.cache-stale-insert.coverage.test.ts +39 -0
  110. package/test/unit/data-structures/binary-tree/red-black-tree.coverage.test.ts +334 -0
  111. package/test/unit/data-structures/binary-tree/red-black-tree.delete-fixup.coverage.test.ts +68 -0
  112. package/test/unit/data-structures/binary-tree/red-black-tree.delete-successor.coverage.test.ts +75 -0
  113. package/test/unit/data-structures/binary-tree/red-black-tree.factories.coverage.test.ts +26 -0
  114. package/test/unit/data-structures/binary-tree/red-black-tree.hint-cache-compare-update.coverage.test.ts +74 -0
  115. package/test/unit/data-structures/binary-tree/red-black-tree.hint-cache-no-update.coverage.test.ts +44 -0
  116. package/test/unit/data-structures/binary-tree/red-black-tree.hint-cache-nullish.coverage.test.ts +61 -0
  117. package/test/unit/data-structures/binary-tree/red-black-tree.hint-mapmode-defined.coverage.test.ts +35 -0
  118. package/test/unit/data-structures/binary-tree/red-black-tree.hint-mapmode-undefined.coverage.test.ts +43 -0
  119. package/test/unit/data-structures/binary-tree/red-black-tree.hint-more.coverage.test.ts +99 -0
  120. package/test/unit/data-structures/binary-tree/red-black-tree.hint.coverage.test.ts +60 -0
  121. package/test/unit/data-structures/binary-tree/red-black-tree.insert-cache-nullish.coverage.test.ts +29 -0
  122. package/test/unit/data-structures/binary-tree/red-black-tree.insert-header-parent-nullish.coverage.test.ts +17 -0
  123. package/test/unit/data-structures/binary-tree/red-black-tree.internal-walk.coverage.test.ts +57 -0
  124. package/test/unit/data-structures/binary-tree/red-black-tree.minmax-cache.test.ts +65 -0
  125. package/test/unit/data-structures/binary-tree/red-black-tree.misc-inputs.coverage.test.ts +17 -0
  126. package/test/unit/data-structures/binary-tree/red-black-tree.more-branches-2.coverage.test.ts +121 -0
  127. package/test/unit/data-structures/binary-tree/red-black-tree.more-branches-3.coverage.test.ts +55 -0
  128. package/test/unit/data-structures/binary-tree/red-black-tree.more-branches-4.coverage.test.ts +44 -0
  129. package/test/unit/data-structures/binary-tree/red-black-tree.predsucc.coverage.test.ts +40 -0
  130. package/test/unit/data-structures/binary-tree/red-black-tree.remaining-branches.coverage.test.ts +123 -0
  131. package/test/unit/data-structures/binary-tree/red-black-tree.set-inputs.coverage.test.ts +64 -0
  132. package/test/unit/data-structures/binary-tree/red-black-tree.setkvnode-parent-cache.coverage.test.ts +79 -0
  133. package/test/unit/data-structures/binary-tree/red-black-tree.setkvnode-remaining.coverage.test.ts +44 -0
  134. package/test/unit/data-structures/binary-tree/red-black-tree.setkvnode-uncovered.coverage.test.ts +74 -0
  135. package/test/unit/data-structures/binary-tree/red-black-tree.test.ts +141 -141
  136. package/test/unit/data-structures/binary-tree/red-black-tree.update-branches.coverage.test.ts +30 -0
  137. package/test/unit/data-structures/binary-tree/segment-tree.more-branches.coverage.test.ts +31 -0
  138. package/test/unit/data-structures/binary-tree/tree-counter.coverage.test.ts +115 -0
  139. package/test/unit/data-structures/binary-tree/tree-counter.more-branches.coverage.test.ts +244 -0
  140. package/test/unit/data-structures/binary-tree/tree-counter.test.ts +41 -39
  141. package/test/unit/data-structures/binary-tree/tree-multi-map.coverage.test.ts +104 -0
  142. package/test/unit/data-structures/binary-tree/tree-multi-map.more-branches-2.coverage.test.ts +59 -0
  143. package/test/unit/data-structures/binary-tree/tree-multi-map.test.ts +145 -145
  144. package/test/unit/data-structures/graph/abstract-graph.more-branches-2.coverage.test.ts +40 -0
  145. package/test/unit/data-structures/graph/abstract-graph.more-branches-3.coverage.test.ts +65 -0
  146. package/test/unit/data-structures/graph/abstract-graph.more-branches-4.coverage.test.ts +98 -0
  147. package/test/unit/data-structures/graph/abstract-graph.more-branches-5.coverage.test.ts +51 -0
  148. package/test/unit/data-structures/graph/abstract-graph.more-branches.coverage.test.ts +62 -0
  149. package/test/unit/data-structures/graph/directed-graph.more-branches-2.coverage.test.ts +38 -0
  150. package/test/unit/data-structures/graph/directed-graph.more-branches-3.coverage.test.ts +25 -0
  151. package/test/unit/data-structures/graph/directed-graph.more-branches.coverage.test.ts +82 -0
  152. package/test/unit/data-structures/graph/map-graph.more-branches.coverage.test.ts +22 -0
  153. package/test/unit/data-structures/graph/undirected-graph.more-branches-2.coverage.test.ts +35 -0
  154. package/test/unit/data-structures/graph/undirected-graph.more-branches.coverage.test.ts +87 -0
  155. package/test/unit/data-structures/hash/hash-map.more-branches.coverage.test.ts +64 -0
  156. package/test/unit/data-structures/hash/hash-map.toEntryFn-branch.coverage.test.ts +9 -0
  157. package/test/unit/data-structures/heap/heap.misc-branches.coverage.test.ts +110 -0
  158. package/test/unit/data-structures/heap/heap.remaining-branches.coverage.test.ts +22 -0
  159. package/test/unit/data-structures/heap/max-heap.coverage.test.ts +29 -0
  160. package/test/unit/data-structures/linked-list/doubly-linked-list.more-branches.coverage.test.ts +72 -0
  161. package/test/unit/data-structures/linked-list/linked-list.unshiftMany-else.coverage.test.ts +15 -0
  162. package/test/unit/data-structures/linked-list/singly-linked-list.coverage.test.ts +221 -0
  163. package/test/unit/data-structures/linked-list/singly-linked-list.more-branches.coverage.test.ts +86 -0
  164. package/test/unit/data-structures/linked-list/skip-linked-list.more-branches.coverage.test.ts +31 -0
  165. package/test/unit/data-structures/matrix/matrix.more-branches.coverage.test.ts +81 -0
  166. package/test/unit/data-structures/matrix/matrix.pivotElement-nullish.coverage.test.ts +28 -0
  167. package/test/unit/data-structures/priority-queue/max-priority-queue.more-branches.coverage.test.ts +10 -0
  168. package/test/unit/data-structures/priority-queue/priority-queue.coverage.test.ts +21 -0
  169. package/test/unit/data-structures/queue/deque.coverage.test.ts +173 -0
  170. package/test/unit/data-structures/queue/deque.more-branches-2.coverage.test.ts +39 -0
  171. package/test/unit/data-structures/queue/deque.more-branches-3.coverage.test.ts +9 -0
  172. package/test/unit/data-structures/queue/deque.more-branches.coverage.test.ts +95 -0
  173. package/test/unit/data-structures/queue/queue.coverage.test.ts +138 -0
  174. package/test/unit/data-structures/queue/queue.more-branches-2.coverage.test.ts +27 -0
  175. package/test/unit/data-structures/stack/stack.coverage.test.ts +112 -0
  176. package/test/unit/data-structures/tree/tree.more-branches.coverage.test.ts +9 -0
  177. package/test/unit/data-structures/trie/trie.more-branches-2.coverage.test.ts +51 -0
  178. package/test/utils/patch.ts +33 -0
  179. package/tsup.config.js +50 -21
  180. package/tsup.umd.config.js +29 -0
  181. package/tsup.node.config.js +0 -83
@@ -10,9 +10,9 @@ describe('AVLTreeMultiMap', () => {
10
10
  });
11
11
 
12
12
  it('Should add and delete values', () => {
13
- avlTmm.add(3, 3);
14
- avlTmm.add(3, 33);
15
- avlTmm.add(3, 333);
13
+ avlTmm.set(3, 3);
14
+ avlTmm.set(3, 33);
15
+ avlTmm.set(3, 333);
16
16
  expect(avlTmm.get(3)).toEqual([3, 33, 333]);
17
17
  avlTmm.deleteValue(3, 33);
18
18
  expect(avlTmm.get(3)).toEqual([3, 333]);
@@ -20,8 +20,8 @@ describe('AVLTreeMultiMap', () => {
20
20
  expect(avlTmm.get(3)).toEqual([333]);
21
21
  avlTmm.deleteValue(3, 333);
22
22
  expect(avlTmm.get(3)).toBe(undefined);
23
- avlTmm.add(3, 3);
24
- avlTmm.add([3, [3333, 33333]]);
23
+ avlTmm.set(3, 3);
24
+ avlTmm.set([3, [3333, 33333]]);
25
25
  expect(avlTmm.get(3)).toEqual([3, 3333, 33333]);
26
26
  });
27
27
  });
@@ -31,9 +31,9 @@ describe('AVLTreeMultiMap Test', () => {
31
31
  const arr = [11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
32
32
  const avlTmm = new AVLTreeMultiMap<number>();
33
33
 
34
- for (const i of arr) avlTmm.add([i, [i]]);
34
+ for (const i of arr) avlTmm.set([i, [i]]);
35
35
 
36
- avlTmm.add(null);
36
+ avlTmm.set(null);
37
37
  const node6 = avlTmm.getNode(6);
38
38
 
39
39
  expect(node6 && avlTmm.getHeight(node6)).toBe(3);
@@ -137,17 +137,17 @@ describe('AVLTreeMultiMap Test', () => {
137
137
  const avlTmm = new AVLTreeMultiMap<number, string>([4, 5, [1, ['1']], 2, 3]);
138
138
  expect(avlTmm.get(1)).toEqual(['1']);
139
139
  expect(avlTmm.getNode(1)?.value).toEqual([]);
140
- avlTmm.add(1, 'a');
140
+ avlTmm.set(1, 'a');
141
141
  expect(avlTmm.get(1)).toEqual(['1', 'a']);
142
- avlTmm.add([1, ['b']]);
142
+ avlTmm.set([1, ['b']]);
143
143
  expect(avlTmm.getNode(1)?.value).toEqual([]);
144
144
  expect(avlTmm.get(1)).toEqual(['1', 'a', 'b']);
145
145
  const treeMap = new AVLTreeMultiMap<number>([4, 5, [1, ['1']], 2, 3]);
146
146
  expect(treeMap.get(1)).toEqual(['1']);
147
147
  expect(treeMap.getNode(1)?.value).toEqual([]);
148
- treeMap.add(1, 'a');
148
+ treeMap.set(1, 'a');
149
149
  expect(treeMap.get(1)).toEqual(['1', 'a']);
150
- treeMap.add([1, ['b']]);
150
+ treeMap.set([1, ['b']]);
151
151
  expect(treeMap.getNode(1)?.value).toEqual([]);
152
152
  expect(treeMap.get(1)).toEqual(['1', 'a', 'b']);
153
153
  });
@@ -158,7 +158,7 @@ describe('AVLTreeMultiMap Test recursively', () => {
158
158
  const arr = [11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
159
159
  const avlTmm = new AVLTreeMultiMap<number>([], { iterationType: 'RECURSIVE' });
160
160
 
161
- for (const i of arr) avlTmm.add([i, [i]]);
161
+ for (const i of arr) avlTmm.set([i, [i]]);
162
162
 
163
163
  const node6 = avlTmm.getNode(6);
164
164
 
@@ -269,17 +269,17 @@ describe('AVLTreeMultiMap APIs test', () => {
269
269
  });
270
270
 
271
271
  it('add', () => {
272
- avlTmm.add(1);
272
+ avlTmm.set(1);
273
273
  const node2 = new AVLTreeMultiMapNode(2, []);
274
- avlTmm.add(node2);
274
+ avlTmm.set(node2);
275
275
  const node3 = new AVLTreeMultiMapNode(3, [
276
276
  {
277
277
  id: 3,
278
278
  text: 'text3'
279
279
  }
280
280
  ]);
281
- avlTmm.add(node3);
282
- avlTmm.add([3, [{ id: 3, text: 'text33' }]]);
281
+ avlTmm.set(node3);
282
+ avlTmm.set([3, [{ id: 3, text: 'text33' }]]);
283
283
 
284
284
  const bfsRes = avlTmm.bfs(node => node.key);
285
285
  expect(bfsRes[0]).toBe(2);
@@ -298,7 +298,7 @@ describe('AVLTreeMultiMap APIs test', () => {
298
298
  }
299
299
 
300
300
  const avlTmm = new AVLTreeMultiMap<string, number>();
301
- avlTmm.addMany([
301
+ avlTmm.setMany([
302
302
  ['2', 2],
303
303
  ['4', 4],
304
304
  ['5', 5],
@@ -326,26 +326,26 @@ describe('AVLTreeMultiMap APIs test', () => {
326
326
  describe('AVLTreeMultiMap', () => {
327
327
  it('should balance the avlTmm using _balanceLR when nodes are added', () => {
328
328
  const avlTmm = new AVLTreeMultiMap();
329
- avlTmm.add([10, 'A']);
330
- avlTmm.add([5, 'B']);
331
- avlTmm.add([15, 'C']);
332
- avlTmm.add([3, 'D']);
333
- avlTmm.add([7, 'E']);
329
+ avlTmm.set([10, 'A']);
330
+ avlTmm.set([5, 'B']);
331
+ avlTmm.set([15, 'C']);
332
+ avlTmm.set([3, 'D']);
333
+ avlTmm.set([7, 'E']);
334
334
 
335
335
  // Adding nodes to trigger _balanceLR
336
- avlTmm.add([12, 'F']);
336
+ avlTmm.set([12, 'F']);
337
337
 
338
338
  // You can add more specific assertions to check the avlTmm's balance and structure.
339
339
  });
340
340
 
341
341
  it('should addMany undefined and null', () => {
342
342
  const avlTmm = new AVLTreeMultiMap<number, string>();
343
- const addManyWithUndefined = avlTmm.addMany([1, undefined, 3]);
343
+ const addManyWithUndefined = avlTmm.setMany([1, undefined, 3]);
344
344
  expect(addManyWithUndefined).toEqual([true, false, true]);
345
345
  expect(avlTmm.get(undefined)).toBe(undefined);
346
- const addManyWithNull = avlTmm.addMany([1, null, 3, 4]);
346
+ const addManyWithNull = avlTmm.setMany([1, null, 3, 4]);
347
347
  expect(addManyWithNull).toEqual([true, false, true, true]);
348
- const addManyEntriesWithNull = avlTmm.addMany([
348
+ const addManyEntriesWithNull = avlTmm.setMany([
349
349
  [1, '1'],
350
350
  [null, 'null'],
351
351
  [3, '3'],
@@ -353,19 +353,19 @@ describe('AVLTreeMultiMap', () => {
353
353
  ]);
354
354
  expect(addManyEntriesWithNull).toEqual([true, false, true, true]);
355
355
  expect(avlTmm.get(null)).toBe(undefined);
356
- const node0 = avlTmm.add(0, '0');
356
+ const node0 = avlTmm.set(0, '0');
357
357
  expect(node0).toBe(true);
358
358
  expect(avlTmm.get(0)).toEqual(['0']);
359
359
  });
360
360
 
361
361
  it('should balance the avlTmm using _balanceLR when nodes are deleted', () => {
362
362
  const avlTmm = new AVLTreeMultiMap();
363
- avlTmm.add([10, 'A']);
364
- avlTmm.add([5, 'B']);
365
- avlTmm.add([15, 'C']);
366
- avlTmm.add([3, 'D']);
367
- avlTmm.add([7, 'E']);
368
- avlTmm.add([12, 'F']);
363
+ avlTmm.set([10, 'A']);
364
+ avlTmm.set([5, 'B']);
365
+ avlTmm.set([15, 'C']);
366
+ avlTmm.set([3, 'D']);
367
+ avlTmm.set([7, 'E']);
368
+ avlTmm.set([12, 'F']);
369
369
 
370
370
  // Deleting nodes to trigger _balanceLR
371
371
  avlTmm.delete(3);
@@ -380,17 +380,17 @@ describe('AVLTreeMultiMap', () => {
380
380
  });
381
381
 
382
382
  it('add', () => {
383
- avlTmm.add(1);
383
+ avlTmm.set(1);
384
384
  const node2 = new AVLTreeMultiMapNode(2, []);
385
- avlTmm.add(node2);
385
+ avlTmm.set(node2);
386
386
  const node3 = new AVLTreeMultiMapNode(3, [
387
387
  {
388
388
  id: 3,
389
389
  text: 'text3'
390
390
  }
391
391
  ]);
392
- avlTmm.add(node3);
393
- avlTmm.add([3, [{ id: 3, text: 'text33' }]]);
392
+ avlTmm.set(node3);
393
+ avlTmm.set([3, [{ id: 3, text: 'text33' }]]);
394
394
 
395
395
  const bfsRes = avlTmm.bfs(node => node);
396
396
  expect(bfsRes[0]?.key).toBe(2);
@@ -402,9 +402,9 @@ describe('AVLTreeMultiMap iterative methods test', () => {
402
402
  let avlTmm: AVLTreeMultiMap<number, string, object>;
403
403
  beforeEach(() => {
404
404
  avlTmm = new AVLTreeMultiMap();
405
- avlTmm.add([1, ['a']]);
406
- avlTmm.add([2, ['b']]);
407
- avlTmm.add([3, ['c']]);
405
+ avlTmm.set([1, ['a']]);
406
+ avlTmm.set([2, ['b']]);
407
+ avlTmm.set([3, ['c']]);
408
408
  });
409
409
 
410
410
  it('The node obtained by get Node should match the node type', () => {
@@ -490,9 +490,9 @@ describe('AVLTreeMultiMap not map mode', () => {
490
490
  const arr = [11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
491
491
  const avlTmm = new AVLTreeMultiMap<number>([]);
492
492
 
493
- for (const i of arr) avlTmm.add([i, [i]]);
493
+ for (const i of arr) avlTmm.set([i, [i]]);
494
494
 
495
- avlTmm.add(null);
495
+ avlTmm.set(null);
496
496
  const node6 = avlTmm.getNode(6);
497
497
 
498
498
  expect(node6 && avlTmm.getHeight(node6)).toBe(3);
@@ -526,7 +526,7 @@ describe('AVLTreeMultiMap not map mode test recursively', () => {
526
526
  const arr = [11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
527
527
  const avlTmm = new AVLTreeMultiMap<number>([], { iterationType: 'RECURSIVE' });
528
528
 
529
- for (const i of arr) avlTmm.add([i, [i]]);
529
+ for (const i of arr) avlTmm.set([i, [i]]);
530
530
  const node6 = avlTmm.getNode(6);
531
531
 
532
532
  expect(node6 && avlTmm.getHeight(node6)).toBe(3);
@@ -559,9 +559,9 @@ describe('AVLTreeMultiMap iterative methods not map mode', () => {
559
559
  let avlTmm: AVLTreeMultiMap<number, string>;
560
560
  beforeEach(() => {
561
561
  avlTmm = new AVLTreeMultiMap<number, string>([]);
562
- avlTmm.add([1, ['a']]);
563
- avlTmm.add([2, ['b']]);
564
- avlTmm.add([3, ['c']]);
562
+ avlTmm.set([1, ['a']]);
563
+ avlTmm.set([2, ['b']]);
564
+ avlTmm.set([3, ['c']]);
565
565
  });
566
566
 
567
567
  it('should clone work well', () => {
@@ -0,0 +1,17 @@
1
+ import { AVLTreeNode } from '../../../../src';
2
+
3
+ describe('AVLTreeNode familyPosition remaining branch coverage', () => {
4
+ it('left child with its own child reports ROOT_LEFT', () => {
5
+ const parent = new AVLTreeNode<number, number>(2);
6
+ const child = new AVLTreeNode<number, number>(1);
7
+ const grand = new AVLTreeNode<number, number>(0);
8
+
9
+ parent.left = child;
10
+ child.parent = parent;
11
+
12
+ child.left = grand;
13
+ grand.parent = child;
14
+
15
+ expect(child.familyPosition).toBe('ROOT_LEFT');
16
+ });
17
+ });
@@ -0,0 +1,99 @@
1
+ import { AVLTree, AVLTreeNode } from '../../../../src';
2
+
3
+ describe('AVLTree remaining branch coverage (batch 2)', () => {
4
+ it('AVLTreeNode.familyPosition covers parent-missing branch and (left||right)? ternary arms', () => {
5
+ const isolated = new AVLTreeNode<number, number>(1, 1);
6
+ expect(isolated.familyPosition).toBe('ISOLATED');
7
+
8
+ const root = new AVLTreeNode<number, number>(2, 2);
9
+ root.left = new AVLTreeNode<number, number>(1, 1);
10
+ expect(root.familyPosition).toBe('ROOT');
11
+ });
12
+
13
+ it('perfectlyBalance returns false on empty tree', () => {
14
+ const t = new AVLTree<number, number>([], { isMapMode: false });
15
+ expect(t.perfectlyBalance()).toBe(false);
16
+ });
17
+
18
+ it('_createLike default-arg iter=[] path', () => {
19
+ const t = new AVLTree<number, number>([], { isMapMode: false });
20
+ const like = (t as any)._createLike();
21
+ expect(like.size).toBe(0);
22
+ });
23
+
24
+ it('_swapProperties assigns values when isMapMode=false (covers if(!this._isMapMode) branches)', () => {
25
+ const t = new AVLTree<number, string>([], { isMapMode: false });
26
+ t.set(1, 'a');
27
+ t.set(2, 'b');
28
+
29
+ const n1 = t.getNode(1)!;
30
+ const n2 = t.getNode(2)!;
31
+
32
+ (t as any)._swapProperties(n1, n2);
33
+
34
+ // Node identities remain; their key/value payloads swap.
35
+ expect(n1.key).toBe(2);
36
+ expect(n1.value).toBe('b');
37
+ expect(n2.key).toBe(1);
38
+ expect(n2.value).toBe('a');
39
+ });
40
+
41
+ it('_balanceLL executes parentOfA.left===A branch (line ~624)', () => {
42
+ const t = new AVLTree<number, number>([], { isMapMode: false });
43
+
44
+ const P = new AVLTreeNode<number, number>(10, 10);
45
+ const A = new AVLTreeNode<number, number>(5, 5);
46
+ const B = new AVLTreeNode<number, number>(2, 2);
47
+ const Br = new AVLTreeNode<number, number>(3, 3);
48
+
49
+ // Build P.left = A, A.left = B, B.right = Br
50
+ P.left = A;
51
+ A.parent = P;
52
+ A.left = B;
53
+ B.parent = A;
54
+ B.right = Br;
55
+ Br.parent = B;
56
+
57
+ (t as any)._setRoot(P);
58
+
59
+ (t as any)._balanceLL(A);
60
+
61
+ // After LL rotation, P.left should now be B
62
+ expect(P.left?.key).toBe(2);
63
+ expect((t as any).root.key).toBe(10);
64
+ });
65
+
66
+ it('_balanceLR hits C.left branch and inner parent assignment (lines ~657-658)', () => {
67
+ const t = new AVLTree<number, number>([], { isMapMode: false });
68
+
69
+ const P = new AVLTreeNode<number, number>(10, 10);
70
+ const A = new AVLTreeNode<number, number>(5, 5);
71
+ const B = new AVLTreeNode<number, number>(2, 2);
72
+ const C = new AVLTreeNode<number, number>(3, 3);
73
+ const CL = new AVLTreeNode<number, number>(2.5 as any, 25);
74
+ const CR = new AVLTreeNode<number, number>(4 as any, 40);
75
+
76
+ // P.left = A, A.left = B, B.right = C, and C has both children
77
+ P.left = A;
78
+ A.parent = P;
79
+ A.left = B;
80
+ B.parent = A;
81
+ B.right = C;
82
+ C.parent = B;
83
+ C.left = CL;
84
+ CL.parent = C;
85
+ C.right = CR;
86
+ CR.parent = C;
87
+
88
+ (t as any)._setRoot(P);
89
+
90
+ (t as any)._balanceLR(A);
91
+
92
+ // inner branch should have set CL.parent = B
93
+ expect(CL.parent).toBe(B);
94
+ // and CR.parent = A
95
+ expect(CR.parent).toBe(A);
96
+ // P.left should now be C
97
+ expect(P.left?.key).toBe(3);
98
+ });
99
+ });
@@ -5,9 +5,9 @@ describe('AVL Tree Test', () => {
5
5
  const arr = [11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
6
6
  const avlTree = new AVLTree<number>();
7
7
 
8
- for (const i of arr) avlTree.add([i, i]);
8
+ for (const i of arr) avlTree.set([i, i]);
9
9
 
10
- avlTree.add(null);
10
+ avlTree.set(null);
11
11
  const node6 = avlTree.getNode(6);
12
12
 
13
13
  expect(node6 && avlTree.getHeight(node6)).toBe(3);
@@ -111,17 +111,17 @@ describe('AVL Tree Test', () => {
111
111
  const avlTree = new AVLTree<number, string>([4, 5, [1, '1'], 2, 3], { isMapMode: false });
112
112
  expect(avlTree.get(1)).toBe('1');
113
113
  expect(avlTree.getNode(1)?.value).toBe('1');
114
- avlTree.add(1, 'a');
114
+ avlTree.set(1, 'a');
115
115
  expect(avlTree.get(1)).toBe('a');
116
- avlTree.add([1, 'b']);
116
+ avlTree.set([1, 'b']);
117
117
  expect(avlTree.getNode(1)?.value).toBe('b');
118
118
  expect(avlTree.get(1)).toBe('b');
119
119
  const treeMap = new AVLTree<number>([4, 5, [1, '1'], 2, 3]);
120
120
  expect(treeMap.get(1)).toBe('1');
121
121
  expect(treeMap.getNode(1)?.value).toBe(undefined);
122
- treeMap.add(1, 'a');
122
+ treeMap.set(1, 'a');
123
123
  expect(treeMap.get(1)).toBe('a');
124
- treeMap.add([1, 'b']);
124
+ treeMap.set([1, 'b']);
125
125
  expect(treeMap.getNode(1)?.value).toBe(undefined);
126
126
  expect(treeMap.get(1)).toBe('b');
127
127
  });
@@ -132,7 +132,7 @@ describe('AVL Tree Test recursively', () => {
132
132
  const arr = [11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
133
133
  const avlTree = new AVLTree<number>([], { iterationType: 'RECURSIVE' });
134
134
 
135
- for (const i of arr) avlTree.add([i, i]);
135
+ for (const i of arr) avlTree.set([i, i]);
136
136
 
137
137
  const node6 = avlTree.getNode(6);
138
138
 
@@ -243,15 +243,15 @@ describe('AVLTree APIs test', () => {
243
243
  });
244
244
 
245
245
  it('add', () => {
246
- avlTree.add(1);
246
+ avlTree.set(1);
247
247
  const node2 = new AVLTreeNode(2);
248
- avlTree.add(node2);
248
+ avlTree.set(node2);
249
249
  const node3 = new AVLTreeNode(3, {
250
250
  id: 3,
251
251
  text: 'text3'
252
252
  });
253
- avlTree.add(node3);
254
- avlTree.add([3, { id: 3, text: 'text33' }]);
253
+ avlTree.set(node3);
254
+ avlTree.set([3, { id: 3, text: 'text33' }]);
255
255
 
256
256
  const bfsRes = avlTree.bfs(node => node.key);
257
257
  expect(bfsRes[0]).toBe(2);
@@ -270,7 +270,7 @@ describe('AVLTree APIs test', () => {
270
270
  }
271
271
 
272
272
  const avlTree = new AVLTree<string, number>();
273
- avlTree.addMany([
273
+ avlTree.setMany([
274
274
  ['2', 2],
275
275
  ['4', 4],
276
276
  ['5', 5],
@@ -298,26 +298,26 @@ describe('AVLTree APIs test', () => {
298
298
  describe('AVLTree', () => {
299
299
  it('should balance the avlTree using _balanceLR when nodes are added', () => {
300
300
  const avlTree = new AVLTree();
301
- avlTree.add([10, 'A']);
302
- avlTree.add([5, 'B']);
303
- avlTree.add([15, 'C']);
304
- avlTree.add([3, 'D']);
305
- avlTree.add([7, 'E']);
301
+ avlTree.set([10, 'A']);
302
+ avlTree.set([5, 'B']);
303
+ avlTree.set([15, 'C']);
304
+ avlTree.set([3, 'D']);
305
+ avlTree.set([7, 'E']);
306
306
 
307
307
  // Adding nodes to trigger _balanceLR
308
- avlTree.add([12, 'F']);
308
+ avlTree.set([12, 'F']);
309
309
 
310
310
  // You can add more specific assertions to check the avlTree's balance and structure.
311
311
  });
312
312
 
313
313
  it('should addMany undefined and null', () => {
314
314
  const avlTree = new AVLTree<number, string>();
315
- const addManyWithUndefined = avlTree.addMany([1, undefined, 3]);
315
+ const addManyWithUndefined = avlTree.setMany([1, undefined, 3]);
316
316
  expect(addManyWithUndefined).toEqual([true, false, true]);
317
317
  expect(avlTree.get(undefined)).toBe(undefined);
318
- const addManyWithNull = avlTree.addMany([1, null, 3, 4]);
318
+ const addManyWithNull = avlTree.setMany([1, null, 3, 4]);
319
319
  expect(addManyWithNull).toEqual([true, false, true, true]);
320
- const addManyEntriesWithNull = avlTree.addMany([
320
+ const addManyEntriesWithNull = avlTree.setMany([
321
321
  [1, '1'],
322
322
  [null, 'null'],
323
323
  [3, '3'],
@@ -325,19 +325,19 @@ describe('AVLTree', () => {
325
325
  ]);
326
326
  expect(addManyEntriesWithNull).toEqual([true, false, true, true]);
327
327
  expect(avlTree.get(null)).toBe(undefined);
328
- const node0 = avlTree.add(0, '0');
328
+ const node0 = avlTree.set(0, '0');
329
329
  expect(node0).toBe(true);
330
330
  expect(avlTree.get(0)).toBe('0');
331
331
  });
332
332
 
333
333
  it('should balance the avlTree using _balanceLR when nodes are deleted', () => {
334
334
  const avlTree = new AVLTree();
335
- avlTree.add([10, 'A']);
336
- avlTree.add([5, 'B']);
337
- avlTree.add([15, 'C']);
338
- avlTree.add([3, 'D']);
339
- avlTree.add([7, 'E']);
340
- avlTree.add([12, 'F']);
335
+ avlTree.set([10, 'A']);
336
+ avlTree.set([5, 'B']);
337
+ avlTree.set([15, 'C']);
338
+ avlTree.set([3, 'D']);
339
+ avlTree.set([7, 'E']);
340
+ avlTree.set([12, 'F']);
341
341
 
342
342
  // Deleting nodes to trigger _balanceLR
343
343
  avlTree.delete(3);
@@ -352,15 +352,15 @@ describe('AVLTree', () => {
352
352
  });
353
353
 
354
354
  it('add', () => {
355
- avlTree.add(1);
355
+ avlTree.set(1);
356
356
  const node2 = new AVLTreeNode(2);
357
- avlTree.add(node2);
357
+ avlTree.set(node2);
358
358
  const node3 = new AVLTreeNode(3, {
359
359
  id: 3,
360
360
  text: 'text3'
361
361
  });
362
- avlTree.add(node3);
363
- avlTree.add([3, { id: 3, text: 'text33' }]);
362
+ avlTree.set(node3);
363
+ avlTree.set([3, { id: 3, text: 'text33' }]);
364
364
 
365
365
  const bfsRes = avlTree.bfs(node => node);
366
366
  expect(bfsRes[0]?.key).toBe(2);
@@ -372,9 +372,9 @@ describe('AVLTree iterative methods test', () => {
372
372
  let avlTree: AVLTree<number, string>;
373
373
  beforeEach(() => {
374
374
  avlTree = new AVLTree();
375
- avlTree.add([1, 'a']);
376
- avlTree.add([2, 'b']);
377
- avlTree.add([3, 'c']);
375
+ avlTree.set([1, 'a']);
376
+ avlTree.set([2, 'b']);
377
+ avlTree.set([3, 'c']);
378
378
  });
379
379
 
380
380
  it('The node obtained by get Node should match the node type', () => {
@@ -461,9 +461,9 @@ describe('AVL Tree not map mode', () => {
461
461
  const arr = [11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
462
462
  const avlTree = new AVLTree<number>([], { isMapMode: false });
463
463
 
464
- for (const i of arr) avlTree.add([i, i]);
464
+ for (const i of arr) avlTree.set([i, i]);
465
465
 
466
- avlTree.add(null);
466
+ avlTree.set(null);
467
467
  const node6 = avlTree.getNode(6);
468
468
 
469
469
  expect(node6 && avlTree.getHeight(node6)).toBe(3);
@@ -497,7 +497,7 @@ describe('AVL Tree not map mode test recursively', () => {
497
497
  const arr = [11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
498
498
  const avlTree = new AVLTree<number>([], { iterationType: 'RECURSIVE', isMapMode: false });
499
499
 
500
- for (const i of arr) avlTree.add([i, i]);
500
+ for (const i of arr) avlTree.set([i, i]);
501
501
 
502
502
  const node6 = avlTree.getNode(6);
503
503
 
@@ -531,9 +531,9 @@ describe('AVLTree iterative methods not map mode', () => {
531
531
  let avlTree: AVLTree<number, string>;
532
532
  beforeEach(() => {
533
533
  avlTree = new AVLTree<number, string>([], { isMapMode: false });
534
- avlTree.add([1, 'a']);
535
- avlTree.add([2, 'b']);
536
- avlTree.add([3, 'c']);
534
+ avlTree.set([1, 'a']);
535
+ avlTree.set([2, 'b']);
536
+ avlTree.set([3, 'c']);
537
537
  });
538
538
 
539
539
  it('should clone work well', () => {
@@ -562,7 +562,7 @@ describe('classic use', () => {
562
562
  expect(tree.size).toBe(5);
563
563
 
564
564
  // Add a new element
565
- tree.add(3);
565
+ tree.set(3);
566
566
  expect(tree.size).toBe(6);
567
567
  expect([...tree.keys()]).toEqual([1, 2, 3, 5, 8, 9]);
568
568
  });
@@ -628,7 +628,7 @@ describe('classic use', () => {
628
628
  expect(universityTree.isAVLBalanced()).toBe(true);
629
629
 
630
630
  // Add more universities
631
- universityTree.add(6, { name: 'Oxford', rank: 6, students: 2000 });
631
+ universityTree.set(6, { name: 'Oxford', rank: 6, students: 2000 });
632
632
  expect(universityTree.isAVLBalanced()).toBe(true);
633
633
 
634
634
  // Delete and verify balance is maintained
@@ -0,0 +1,18 @@
1
+ import { BinaryIndexedTree } from '../../../../src';
2
+
3
+ describe('BinaryIndexedTree remaining branch coverage', () => {
4
+ it('constructor sets negativeCount=max when frequency < 0 (ternary true arm)', () => {
5
+ const bit = new BinaryIndexedTree({ max: 10, frequency: -1 });
6
+ expect(bit.negativeCount).toBe(10);
7
+ });
8
+
9
+ it('read() throws when count is not an integer', () => {
10
+ const bit = new BinaryIndexedTree({ max: 10 });
11
+ expect(() => bit.read(1.5)).toThrow('Invalid count');
12
+ });
13
+
14
+ it('index validation throws when index is not an integer', () => {
15
+ const bit = new BinaryIndexedTree({ max: 10 });
16
+ expect(() => bit.readSingle(1.2 as any)).toThrow('Invalid index');
17
+ });
18
+ });
@@ -0,0 +1,56 @@
1
+ import { BinaryTree } from '../../../../src';
2
+
3
+ describe('BinaryTree extra branch coverage', () => {
4
+ it('isBST(RECURSIVE) evaluates both standard and inverse checks when standard fails (covers isStandardBST || isInverseBST second operand)', () => {
5
+ const t = new BinaryTree<number, number>([], { isMapMode: false });
6
+
7
+ // Manually wire an inverse BST (left > root > right)
8
+ const root = t.createNode(10, 10);
9
+ const left = t.createNode(15, 15);
10
+ const right = t.createNode(5, 5);
11
+ root.left = left;
12
+ root.right = right;
13
+ left.parent = root;
14
+ right.parent = root;
15
+
16
+ // Force as root (avoid BFS insertion semantics)
17
+ (t as any)._setRoot(root);
18
+
19
+ // This shape violates standard BST ordering, so the first check is false, forcing evaluation of the inverse check.
20
+ expect(t.isBST(root as any, 'RECURSIVE' as any)).toBe(false);
21
+ });
22
+
23
+ it('getPathToRoot with isReverse=false takes the non-reverse branch', () => {
24
+ const t = new BinaryTree<number, number>([], { isMapMode: false });
25
+ const root = t.createNode(1, 1);
26
+ const child = t.createNode(2, 2);
27
+ root.left = child;
28
+ child.parent = root;
29
+ (t as any)._setRoot(root);
30
+
31
+ const out = t.getPathToRoot(child as any, (n: any) => n?.key, false);
32
+ expect(out).toEqual([2, 1]);
33
+ });
34
+
35
+ it('getSuccessor returns undefined when x is not a real node (covers !isRealNode guard)', () => {
36
+ const t = new BinaryTree<number, number>([], { isMapMode: false });
37
+ expect(t.getSuccessor(null as any)).toBeUndefined();
38
+ });
39
+
40
+ it('_dfs uses default parameters (default args) and returns in-order keys', () => {
41
+ const t = new BinaryTree<number, number>([], { isMapMode: false });
42
+ // BinaryTree.set is BFS: insert 2 as left child of 1.
43
+ t.set(1, 1);
44
+ t.set(2, 2);
45
+
46
+ const out = (t as any)._dfs();
47
+ // default pattern is IN; with BFS-built tree (1 with left=2), IN traversal is [2, 1]
48
+ expect(out).toEqual([2, 1]);
49
+ });
50
+
51
+ it('_keyValueNodeOrEntryToNodeAndValue([undefined, v]) returns [undefined, undefined] (covers entry-undefined guard)', () => {
52
+ const t = new BinaryTree<number, number>([], { isMapMode: false });
53
+ const out = (t as any)._keyValueNodeOrEntryToNodeAndValue([undefined as any, 1] as any);
54
+ expect(out).toEqual([undefined, undefined]);
55
+ });
56
+ });