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.
- package/.github/workflows/ci.yml +9 -0
- package/CHANGELOG.md +1 -1
- package/README.md +14 -3
- package/README_CN.md +119 -275
- package/benchmark/report.html +1 -1
- package/benchmark/report.json +20 -324
- package/dist/cjs/index.cjs +689 -182
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs-legacy/index.cjs +693 -185
- package/dist/cjs-legacy/index.cjs.map +1 -1
- package/dist/esm/index.mjs +689 -182
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm-legacy/index.mjs +693 -185
- package/dist/esm-legacy/index.mjs.map +1 -1
- package/dist/leetcode/avl-tree-counter.mjs +2957 -0
- package/dist/leetcode/avl-tree-multi-map.mjs +2889 -0
- package/dist/leetcode/avl-tree.mjs +2720 -0
- package/dist/leetcode/binary-tree.mjs +1594 -0
- package/dist/leetcode/bst.mjs +2398 -0
- package/dist/leetcode/deque.mjs +683 -0
- package/dist/leetcode/directed-graph.mjs +1733 -0
- package/dist/leetcode/doubly-linked-list.mjs +709 -0
- package/dist/leetcode/hash-map.mjs +493 -0
- package/dist/leetcode/heap.mjs +542 -0
- package/dist/leetcode/max-heap.mjs +375 -0
- package/dist/leetcode/max-priority-queue.mjs +383 -0
- package/dist/leetcode/min-heap.mjs +363 -0
- package/dist/leetcode/min-priority-queue.mjs +371 -0
- package/dist/leetcode/priority-queue.mjs +363 -0
- package/dist/leetcode/queue.mjs +943 -0
- package/dist/leetcode/red-black-tree.mjs +2765 -0
- package/dist/leetcode/singly-linked-list.mjs +754 -0
- package/dist/leetcode/stack.mjs +217 -0
- package/dist/leetcode/tree-counter.mjs +3039 -0
- package/dist/leetcode/tree-multi-map.mjs +2913 -0
- package/dist/leetcode/trie.mjs +413 -0
- package/dist/leetcode/undirected-graph.mjs +1650 -0
- package/dist/types/data-structures/base/linear-base.d.ts +6 -6
- package/dist/types/data-structures/binary-tree/avl-tree-counter.d.ts +1 -1
- package/dist/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +2 -2
- package/dist/types/data-structures/binary-tree/avl-tree.d.ts +10 -10
- package/dist/types/data-structures/binary-tree/binary-tree.d.ts +25 -27
- package/dist/types/data-structures/binary-tree/bst.d.ts +13 -12
- package/dist/types/data-structures/binary-tree/red-black-tree.d.ts +151 -21
- package/dist/types/data-structures/binary-tree/tree-counter.d.ts +4 -4
- package/dist/types/data-structures/binary-tree/tree-multi-map.d.ts +2 -2
- package/dist/types/interfaces/binary-tree.d.ts +1 -1
- package/dist/umd/data-structure-typed.js +689 -181
- package/dist/umd/data-structure-typed.js.map +1 -1
- package/dist/umd/data-structure-typed.min.js +3 -3
- package/dist/umd/data-structure-typed.min.js.map +1 -1
- package/package.json +50 -172
- package/src/data-structures/base/linear-base.ts +2 -12
- package/src/data-structures/binary-tree/avl-tree-counter.ts +6 -6
- package/src/data-structures/binary-tree/avl-tree-multi-map.ts +13 -13
- package/src/data-structures/binary-tree/avl-tree.ts +15 -15
- package/src/data-structures/binary-tree/binary-tree.ts +57 -60
- package/src/data-structures/binary-tree/bst.ts +100 -26
- package/src/data-structures/binary-tree/red-black-tree.ts +586 -76
- package/src/data-structures/binary-tree/tree-counter.ts +25 -13
- package/src/data-structures/binary-tree/tree-multi-map.ts +13 -13
- package/src/data-structures/queue/deque.ts +10 -0
- package/src/interfaces/binary-tree.ts +1 -1
- package/test/performance/data-structures/binary-tree/red-black-tree.test.ts +1 -2
- package/test/unit/data-structures/base/iterable-element-base.coverage.test.ts +106 -0
- package/test/unit/data-structures/base/iterable-element-base.more-branches.coverage.test.ts +61 -0
- package/test/unit/data-structures/base/linear-base.array.coverage.test.ts +168 -0
- package/test/unit/data-structures/base/linear-base.concat-else.coverage.test.ts +82 -0
- package/test/unit/data-structures/base/linear-base.coverage.test.ts +72 -0
- package/test/unit/data-structures/base/linear-base.more-branches.coverage.test.ts +417 -0
- package/test/unit/data-structures/binary-tree/avl-tree-counter.more-branches-3.coverage.test.ts +146 -0
- package/test/unit/data-structures/binary-tree/avl-tree-counter.more-branches.coverage.test.ts +93 -0
- package/test/unit/data-structures/binary-tree/avl-tree-counter.test.ts +30 -30
- package/test/unit/data-structures/binary-tree/avl-tree-multi-map.coverage.test.ts +108 -0
- package/test/unit/data-structures/binary-tree/avl-tree-multi-map.more-branches-2.coverage.test.ts +85 -0
- package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +46 -46
- package/test/unit/data-structures/binary-tree/avl-tree-node.familyPosition-root-left.coverage.test.ts +17 -0
- package/test/unit/data-structures/binary-tree/avl-tree.more-branches-2.coverage.test.ts +99 -0
- package/test/unit/data-structures/binary-tree/avl-tree.test.ts +43 -43
- package/test/unit/data-structures/binary-tree/binary-indexed-tree.more-branches.coverage.test.ts +18 -0
- package/test/unit/data-structures/binary-tree/binary-tree.more-branches.coverage.test.ts +56 -0
- package/test/unit/data-structures/binary-tree/binary-tree.remaining-branches.coverage.test.ts +229 -0
- package/test/unit/data-structures/binary-tree/binary-tree.test.ts +151 -151
- package/test/unit/data-structures/binary-tree/bst.bound-by-predicate.coverage.test.ts +33 -0
- package/test/unit/data-structures/binary-tree/bst.coverage.test.ts +94 -0
- package/test/unit/data-structures/binary-tree/bst.deletebykey.coverage.test.ts +70 -0
- package/test/unit/data-structures/binary-tree/bst.deletewhere.coverage.test.ts +37 -0
- package/test/unit/data-structures/binary-tree/bst.floor-lower-predicate.coverage.test.ts +29 -0
- package/test/unit/data-structures/binary-tree/bst.floor-setmany.coverage.test.ts +72 -0
- package/test/unit/data-structures/binary-tree/bst.getnode.range-ensure.coverage.test.ts +22 -0
- package/test/unit/data-structures/binary-tree/bst.misc-branches.coverage.test.ts +100 -0
- package/test/unit/data-structures/binary-tree/bst.more-branches-2.coverage.test.ts +133 -0
- package/test/unit/data-structures/binary-tree/bst.more-branches-3.coverage.test.ts +45 -0
- package/test/unit/data-structures/binary-tree/bst.more-branches-4.coverage.test.ts +36 -0
- package/test/unit/data-structures/binary-tree/bst.more-branches-5.coverage.test.ts +40 -0
- package/test/unit/data-structures/binary-tree/bst.more.coverage.test.ts +39 -0
- package/test/unit/data-structures/binary-tree/bst.node-family.coverage.test.ts +29 -0
- package/test/unit/data-structures/binary-tree/bst.range-pruning.coverage.test.ts +43 -0
- package/test/unit/data-structures/binary-tree/bst.search-fastpath.coverage.test.ts +30 -0
- package/test/unit/data-structures/binary-tree/bst.test.ts +124 -154
- package/test/unit/data-structures/binary-tree/overall.test.ts +20 -20
- package/test/unit/data-structures/binary-tree/red-black-tree.boundary-corruption-repair.coverage.test.ts +66 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.boundary-max-update.coverage.test.ts +18 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.boundary-null.coverage.test.ts +53 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.boundary-stale-cache.coverage.test.ts +25 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.boundary-update.coverage.test.ts +23 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.cache-delete.coverage.test.ts +49 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.cache-edge.coverage.test.ts +37 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.cache-stale-insert.coverage.test.ts +39 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.coverage.test.ts +334 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.delete-fixup.coverage.test.ts +68 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.delete-successor.coverage.test.ts +75 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.factories.coverage.test.ts +26 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.hint-cache-compare-update.coverage.test.ts +74 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.hint-cache-no-update.coverage.test.ts +44 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.hint-cache-nullish.coverage.test.ts +61 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.hint-mapmode-defined.coverage.test.ts +35 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.hint-mapmode-undefined.coverage.test.ts +43 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.hint-more.coverage.test.ts +99 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.hint.coverage.test.ts +60 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.insert-cache-nullish.coverage.test.ts +29 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.insert-header-parent-nullish.coverage.test.ts +17 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.internal-walk.coverage.test.ts +57 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.minmax-cache.test.ts +65 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.misc-inputs.coverage.test.ts +17 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.more-branches-2.coverage.test.ts +121 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.more-branches-3.coverage.test.ts +55 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.more-branches-4.coverage.test.ts +44 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.predsucc.coverage.test.ts +40 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.remaining-branches.coverage.test.ts +123 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.set-inputs.coverage.test.ts +64 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.setkvnode-parent-cache.coverage.test.ts +79 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.setkvnode-remaining.coverage.test.ts +44 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.setkvnode-uncovered.coverage.test.ts +74 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.test.ts +141 -141
- package/test/unit/data-structures/binary-tree/red-black-tree.update-branches.coverage.test.ts +30 -0
- package/test/unit/data-structures/binary-tree/segment-tree.more-branches.coverage.test.ts +31 -0
- package/test/unit/data-structures/binary-tree/tree-counter.coverage.test.ts +115 -0
- package/test/unit/data-structures/binary-tree/tree-counter.more-branches.coverage.test.ts +244 -0
- package/test/unit/data-structures/binary-tree/tree-counter.test.ts +41 -39
- package/test/unit/data-structures/binary-tree/tree-multi-map.coverage.test.ts +104 -0
- package/test/unit/data-structures/binary-tree/tree-multi-map.more-branches-2.coverage.test.ts +59 -0
- package/test/unit/data-structures/binary-tree/tree-multi-map.test.ts +145 -145
- package/test/unit/data-structures/graph/abstract-graph.more-branches-2.coverage.test.ts +40 -0
- package/test/unit/data-structures/graph/abstract-graph.more-branches-3.coverage.test.ts +65 -0
- package/test/unit/data-structures/graph/abstract-graph.more-branches-4.coverage.test.ts +98 -0
- package/test/unit/data-structures/graph/abstract-graph.more-branches-5.coverage.test.ts +51 -0
- package/test/unit/data-structures/graph/abstract-graph.more-branches.coverage.test.ts +62 -0
- package/test/unit/data-structures/graph/directed-graph.more-branches-2.coverage.test.ts +38 -0
- package/test/unit/data-structures/graph/directed-graph.more-branches-3.coverage.test.ts +25 -0
- package/test/unit/data-structures/graph/directed-graph.more-branches.coverage.test.ts +82 -0
- package/test/unit/data-structures/graph/map-graph.more-branches.coverage.test.ts +22 -0
- package/test/unit/data-structures/graph/undirected-graph.more-branches-2.coverage.test.ts +35 -0
- package/test/unit/data-structures/graph/undirected-graph.more-branches.coverage.test.ts +87 -0
- package/test/unit/data-structures/hash/hash-map.more-branches.coverage.test.ts +64 -0
- package/test/unit/data-structures/hash/hash-map.toEntryFn-branch.coverage.test.ts +9 -0
- package/test/unit/data-structures/heap/heap.misc-branches.coverage.test.ts +110 -0
- package/test/unit/data-structures/heap/heap.remaining-branches.coverage.test.ts +22 -0
- package/test/unit/data-structures/heap/max-heap.coverage.test.ts +29 -0
- package/test/unit/data-structures/linked-list/doubly-linked-list.more-branches.coverage.test.ts +72 -0
- package/test/unit/data-structures/linked-list/linked-list.unshiftMany-else.coverage.test.ts +15 -0
- package/test/unit/data-structures/linked-list/singly-linked-list.coverage.test.ts +221 -0
- package/test/unit/data-structures/linked-list/singly-linked-list.more-branches.coverage.test.ts +86 -0
- package/test/unit/data-structures/linked-list/skip-linked-list.more-branches.coverage.test.ts +31 -0
- package/test/unit/data-structures/matrix/matrix.more-branches.coverage.test.ts +81 -0
- package/test/unit/data-structures/matrix/matrix.pivotElement-nullish.coverage.test.ts +28 -0
- package/test/unit/data-structures/priority-queue/max-priority-queue.more-branches.coverage.test.ts +10 -0
- package/test/unit/data-structures/priority-queue/priority-queue.coverage.test.ts +21 -0
- package/test/unit/data-structures/queue/deque.coverage.test.ts +173 -0
- package/test/unit/data-structures/queue/deque.more-branches-2.coverage.test.ts +39 -0
- package/test/unit/data-structures/queue/deque.more-branches-3.coverage.test.ts +9 -0
- package/test/unit/data-structures/queue/deque.more-branches.coverage.test.ts +95 -0
- package/test/unit/data-structures/queue/queue.coverage.test.ts +138 -0
- package/test/unit/data-structures/queue/queue.more-branches-2.coverage.test.ts +27 -0
- package/test/unit/data-structures/stack/stack.coverage.test.ts +112 -0
- package/test/unit/data-structures/tree/tree.more-branches.coverage.test.ts +9 -0
- package/test/unit/data-structures/trie/trie.more-branches-2.coverage.test.ts +51 -0
- package/test/utils/patch.ts +33 -0
- package/tsup.config.js +50 -21
- package/tsup.umd.config.js +29 -0
- 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.
|
|
14
|
-
avlTmm.
|
|
15
|
-
avlTmm.
|
|
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.
|
|
24
|
-
avlTmm.
|
|
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.
|
|
34
|
+
for (const i of arr) avlTmm.set([i, [i]]);
|
|
35
35
|
|
|
36
|
-
avlTmm.
|
|
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.
|
|
140
|
+
avlTmm.set(1, 'a');
|
|
141
141
|
expect(avlTmm.get(1)).toEqual(['1', 'a']);
|
|
142
|
-
avlTmm.
|
|
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.
|
|
148
|
+
treeMap.set(1, 'a');
|
|
149
149
|
expect(treeMap.get(1)).toEqual(['1', 'a']);
|
|
150
|
-
treeMap.
|
|
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.
|
|
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.
|
|
272
|
+
avlTmm.set(1);
|
|
273
273
|
const node2 = new AVLTreeMultiMapNode(2, []);
|
|
274
|
-
avlTmm.
|
|
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.
|
|
282
|
-
avlTmm.
|
|
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.
|
|
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.
|
|
330
|
-
avlTmm.
|
|
331
|
-
avlTmm.
|
|
332
|
-
avlTmm.
|
|
333
|
-
avlTmm.
|
|
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.
|
|
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.
|
|
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.
|
|
346
|
+
const addManyWithNull = avlTmm.setMany([1, null, 3, 4]);
|
|
347
347
|
expect(addManyWithNull).toEqual([true, false, true, true]);
|
|
348
|
-
const addManyEntriesWithNull = avlTmm.
|
|
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.
|
|
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.
|
|
364
|
-
avlTmm.
|
|
365
|
-
avlTmm.
|
|
366
|
-
avlTmm.
|
|
367
|
-
avlTmm.
|
|
368
|
-
avlTmm.
|
|
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.
|
|
383
|
+
avlTmm.set(1);
|
|
384
384
|
const node2 = new AVLTreeMultiMapNode(2, []);
|
|
385
|
-
avlTmm.
|
|
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.
|
|
393
|
-
avlTmm.
|
|
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.
|
|
406
|
-
avlTmm.
|
|
407
|
-
avlTmm.
|
|
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.
|
|
493
|
+
for (const i of arr) avlTmm.set([i, [i]]);
|
|
494
494
|
|
|
495
|
-
avlTmm.
|
|
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.
|
|
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.
|
|
563
|
-
avlTmm.
|
|
564
|
-
avlTmm.
|
|
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.
|
|
8
|
+
for (const i of arr) avlTree.set([i, i]);
|
|
9
9
|
|
|
10
|
-
avlTree.
|
|
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.
|
|
114
|
+
avlTree.set(1, 'a');
|
|
115
115
|
expect(avlTree.get(1)).toBe('a');
|
|
116
|
-
avlTree.
|
|
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.
|
|
122
|
+
treeMap.set(1, 'a');
|
|
123
123
|
expect(treeMap.get(1)).toBe('a');
|
|
124
|
-
treeMap.
|
|
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.
|
|
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.
|
|
246
|
+
avlTree.set(1);
|
|
247
247
|
const node2 = new AVLTreeNode(2);
|
|
248
|
-
avlTree.
|
|
248
|
+
avlTree.set(node2);
|
|
249
249
|
const node3 = new AVLTreeNode(3, {
|
|
250
250
|
id: 3,
|
|
251
251
|
text: 'text3'
|
|
252
252
|
});
|
|
253
|
-
avlTree.
|
|
254
|
-
avlTree.
|
|
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.
|
|
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.
|
|
302
|
-
avlTree.
|
|
303
|
-
avlTree.
|
|
304
|
-
avlTree.
|
|
305
|
-
avlTree.
|
|
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.
|
|
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.
|
|
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.
|
|
318
|
+
const addManyWithNull = avlTree.setMany([1, null, 3, 4]);
|
|
319
319
|
expect(addManyWithNull).toEqual([true, false, true, true]);
|
|
320
|
-
const addManyEntriesWithNull = avlTree.
|
|
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.
|
|
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.
|
|
336
|
-
avlTree.
|
|
337
|
-
avlTree.
|
|
338
|
-
avlTree.
|
|
339
|
-
avlTree.
|
|
340
|
-
avlTree.
|
|
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.
|
|
355
|
+
avlTree.set(1);
|
|
356
356
|
const node2 = new AVLTreeNode(2);
|
|
357
|
-
avlTree.
|
|
357
|
+
avlTree.set(node2);
|
|
358
358
|
const node3 = new AVLTreeNode(3, {
|
|
359
359
|
id: 3,
|
|
360
360
|
text: 'text3'
|
|
361
361
|
});
|
|
362
|
-
avlTree.
|
|
363
|
-
avlTree.
|
|
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.
|
|
376
|
-
avlTree.
|
|
377
|
-
avlTree.
|
|
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.
|
|
464
|
+
for (const i of arr) avlTree.set([i, i]);
|
|
465
465
|
|
|
466
|
-
avlTree.
|
|
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.
|
|
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.
|
|
535
|
-
avlTree.
|
|
536
|
-
avlTree.
|
|
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.
|
|
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.
|
|
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
|
package/test/unit/data-structures/binary-tree/binary-indexed-tree.more-branches.coverage.test.ts
ADDED
|
@@ -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
|
+
});
|