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
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { BST } from '../../../../src';
|
|
2
|
+
|
|
3
|
+
describe('BST additional reachable branch coverage (batch 5)', () => {
|
|
4
|
+
it('search(): forces shouldVisitRight key-pruning branch + covers && chain short-circuit variants', () => {
|
|
5
|
+
const t = new BST<number, number>();
|
|
6
|
+
t.setMany([
|
|
7
|
+
[10, 10],
|
|
8
|
+
[20, 20]
|
|
9
|
+
]);
|
|
10
|
+
|
|
11
|
+
const originalIsPredicate = (t as any)._isPredicate.bind(t);
|
|
12
|
+
|
|
13
|
+
const run = (keyNodeOrEntry: any) => {
|
|
14
|
+
let calls = 0;
|
|
15
|
+
(t as any)._isPredicate = (p: any) => {
|
|
16
|
+
// 1st call (isPred computation) => true, to bypass the fast-path.
|
|
17
|
+
// After that, behave like the real implementation so _ensurePredicate works
|
|
18
|
+
// and shouldVisitRight sees "not predicate".
|
|
19
|
+
calls++;
|
|
20
|
+
if (calls === 1) return true;
|
|
21
|
+
return originalIsPredicate(p);
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
try {
|
|
25
|
+
t.search(keyNodeOrEntry);
|
|
26
|
+
} finally {
|
|
27
|
+
(t as any)._isPredicate = originalIsPredicate;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
// 1) benchmarkKey === null => hits first short-circuit (benchmarkKey !== null)
|
|
32
|
+
run([null, 0]);
|
|
33
|
+
|
|
34
|
+
// 2) benchmarkKey === undefined => passes first check, fails second
|
|
35
|
+
run([undefined, 0]);
|
|
36
|
+
|
|
37
|
+
// 3) compare(...) < 0 is false => passes both nullish checks
|
|
38
|
+
run([5, 0]);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { BST, BSTNode, Range } from '../../../../src';
|
|
2
|
+
|
|
3
|
+
describe('BST additional coverage', () => {
|
|
4
|
+
it('BSTNode.familyPosition covers MAL_NODE branch', () => {
|
|
5
|
+
const root = new BSTNode<number, number>(10);
|
|
6
|
+
const mal = new BSTNode<number, number>(5);
|
|
7
|
+
mal.parent = root;
|
|
8
|
+
// parent does not point to mal via left/right
|
|
9
|
+
expect(mal.familyPosition).toBe('MAL_NODE');
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
it('getNode returns undefined for null/undefined, and handles runtime Range input', () => {
|
|
13
|
+
const bst = new BST<number, number>();
|
|
14
|
+
bst.set(2, 2);
|
|
15
|
+
|
|
16
|
+
expect(bst.getNode(undefined as any)).toBeUndefined();
|
|
17
|
+
expect(bst.getNode(null as any)).toBeUndefined();
|
|
18
|
+
|
|
19
|
+
const r = new Range<number>(2, 2, true, true);
|
|
20
|
+
expect(bst.getNode(r as any)?.key).toBe(2);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('getNodes returns [] for null/undefined and ignores entry with null key', () => {
|
|
24
|
+
const bst = new BST<number, number>([2, 1, 3]);
|
|
25
|
+
|
|
26
|
+
expect(bst.getNodes(undefined as any)).toEqual([]);
|
|
27
|
+
expect(bst.getNodes(null as any)).toEqual([]);
|
|
28
|
+
|
|
29
|
+
// entry with null key => targetKey undefined => []
|
|
30
|
+
expect(bst.getNodes([null as any, 123] as any)).toEqual([]);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('getNodes returns [] when startNode is not a real node', () => {
|
|
34
|
+
const bst = new BST<number, number>([2, 1, 3]);
|
|
35
|
+
|
|
36
|
+
// ensureNode(null) => undefined => []
|
|
37
|
+
expect(bst.getNodes(2, false, null as any)).toEqual([]);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { BSTNode } from '../../../../src';
|
|
2
|
+
|
|
3
|
+
describe('BSTNode familyPosition coverage', () => {
|
|
4
|
+
it('covers ISOLATED/ROOT/LEFT/RIGHT/ROOT_LEFT/ROOT_RIGHT and MAL_NODE', () => {
|
|
5
|
+
const isolated = new BSTNode<number, number>(1);
|
|
6
|
+
expect(isolated.familyPosition).toBe('ISOLATED');
|
|
7
|
+
|
|
8
|
+
const root = new BSTNode<number, number>(10);
|
|
9
|
+
const left = new BSTNode<number, number>(5);
|
|
10
|
+
const right = new BSTNode<number, number>(15);
|
|
11
|
+
|
|
12
|
+
root.left = left;
|
|
13
|
+
root.right = right;
|
|
14
|
+
|
|
15
|
+
expect(root.familyPosition).toBe('ROOT');
|
|
16
|
+
expect(left.familyPosition).toBe('LEFT');
|
|
17
|
+
expect(right.familyPosition).toBe('RIGHT');
|
|
18
|
+
|
|
19
|
+
left.left = new BSTNode<number, number>(2);
|
|
20
|
+
right.right = new BSTNode<number, number>(20);
|
|
21
|
+
|
|
22
|
+
expect(left.familyPosition).toBe('ROOT_LEFT');
|
|
23
|
+
expect(right.familyPosition).toBe('ROOT_RIGHT');
|
|
24
|
+
|
|
25
|
+
const mal = new BSTNode<number, number>(999);
|
|
26
|
+
mal.parent = root;
|
|
27
|
+
expect(mal.familyPosition).toBe('MAL_NODE');
|
|
28
|
+
});
|
|
29
|
+
});
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { BST, Range } from '../../../../src';
|
|
2
|
+
|
|
3
|
+
describe('BST range/pruning coverage', () => {
|
|
4
|
+
it('getNodes(range) covers includeLow/includeHigh pruning branches', () => {
|
|
5
|
+
const bst = new BST<number, number>();
|
|
6
|
+
for (const k of [10, 5, 15, 3, 7, 12, 18]) bst.set(k, k);
|
|
7
|
+
|
|
8
|
+
// includeLow/includeHigh true
|
|
9
|
+
const r1 = new Range<number>(7, 12, true, true);
|
|
10
|
+
expect(bst.getNodes(r1 as any).map(n => n.key)).toEqual([7, 10, 12]);
|
|
11
|
+
|
|
12
|
+
// includeLow false (exclude 7)
|
|
13
|
+
const r2 = new Range<number>(7, 12, false, true);
|
|
14
|
+
expect(bst.getNodes(r2 as any).map(n => n.key)).toEqual([10, 12]);
|
|
15
|
+
|
|
16
|
+
// includeHigh false (exclude 12)
|
|
17
|
+
const r3 = new Range<number>(7, 12, true, false);
|
|
18
|
+
expect(bst.getNodes(r3 as any).map(n => n.key)).toEqual([7, 10]);
|
|
19
|
+
|
|
20
|
+
// exclude both ends
|
|
21
|
+
const r4 = new Range<number>(7, 12, false, false);
|
|
22
|
+
expect(bst.getNodes(r4 as any).map(n => n.key)).toEqual([10]);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it('getNodes(predicate) exercises predicate-search shouldVisitLeft/Right fallthrough', () => {
|
|
26
|
+
const bst = new BST<number, number>();
|
|
27
|
+
for (const k of [4, 2, 6, 1, 3, 5, 7]) bst.set(k, k);
|
|
28
|
+
|
|
29
|
+
// Predicate that matches only leaf nodes, to force traversal and filtering.
|
|
30
|
+
const nodes = bst.getNodes(node => !bst.isRealNode(node.left) && !bst.isRealNode(node.right));
|
|
31
|
+
expect(nodes.map(n => n.key).sort((a, b) => a - b)).toEqual([1, 3, 5, 7]);
|
|
32
|
+
|
|
33
|
+
// onlyOne=true should early-exit after first match (in-order => 1)
|
|
34
|
+
const one = bst.getNodes(node => !bst.isRealNode(node.left) && !bst.isRealNode(node.right), true);
|
|
35
|
+
expect(one).toHaveLength(1);
|
|
36
|
+
expect(one[0].key).toBe(1);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('rangeSearch overload [low, high] is accepted', () => {
|
|
40
|
+
const bst = new BST<number, number>([10, 5, 15, 3, 7, 12, 18]);
|
|
41
|
+
expect(bst.rangeSearch([7, 12])).toEqual([7, 10, 12]);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { BST } from '../../../../src';
|
|
2
|
+
|
|
3
|
+
describe('BST search() fast-path coverage', () => {
|
|
4
|
+
it('search(node) uses node.key extraction branch and returns callback result', () => {
|
|
5
|
+
const t = new BST<number, string>([], { isMapMode: false });
|
|
6
|
+
t.set(10, 'a');
|
|
7
|
+
t.set(5, 'b');
|
|
8
|
+
t.set(15, 'c');
|
|
9
|
+
|
|
10
|
+
const n5 = t.getNode(5)!;
|
|
11
|
+
const out = t.search(n5, false, (n: any) => n.value);
|
|
12
|
+
expect(out).toEqual(['b']);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('search(entry) with null key returns [] (covers entry null-key guard in fast path)', () => {
|
|
16
|
+
const t = new BST<number, number>([], { isMapMode: false });
|
|
17
|
+
for (const k of [10, 5, 15]) t.set(k, k);
|
|
18
|
+
|
|
19
|
+
const out = t.search([null as any, 1] as any);
|
|
20
|
+
expect(out).toEqual([]);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('search by key returns [] when startNode ensureNode fails', () => {
|
|
24
|
+
const t = new BST<number, number>([], { isMapMode: false });
|
|
25
|
+
for (const k of [10, 5, 15]) t.set(k, k);
|
|
26
|
+
|
|
27
|
+
const out = t.search(10 as any, false, (n: any) => n.key, null as any);
|
|
28
|
+
expect(out).toEqual([]);
|
|
29
|
+
});
|
|
30
|
+
});
|