data-structure-typed 1.53.7 → 1.53.9
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/CHANGELOG.md +1 -1
- package/CONTRIBUTING.md +1 -1
- package/dist/cjs/common/index.js +5 -0
- package/dist/cjs/common/index.js.map +1 -1
- package/dist/cjs/data-structures/base/iterable-entry-base.js +4 -4
- package/dist/cjs/data-structures/base/iterable-entry-base.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +36 -17
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js +65 -36
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +12 -8
- package/dist/cjs/data-structures/binary-tree/avl-tree.js +19 -6
- package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +53 -40
- package/dist/cjs/data-structures/binary-tree/binary-tree.js +76 -72
- package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/bst.d.ts +87 -52
- package/dist/cjs/data-structures/binary-tree/bst.js +111 -63
- package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/index.d.ts +1 -1
- package/dist/cjs/data-structures/binary-tree/index.js +1 -1
- package/dist/cjs/data-structures/binary-tree/index.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/{rb-tree.d.ts → red-black-tree.d.ts} +83 -10
- package/dist/cjs/data-structures/binary-tree/{rb-tree.js → red-black-tree.js} +92 -45
- package/dist/cjs/data-structures/binary-tree/red-black-tree.js.map +1 -0
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.d.ts +34 -18
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.js +66 -40
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.js.map +1 -1
- package/dist/cjs/data-structures/graph/abstract-graph.js +2 -2
- package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
- package/dist/cjs/data-structures/hash/hash-map.d.ts +31 -1
- package/dist/cjs/data-structures/hash/hash-map.js +35 -5
- package/dist/cjs/data-structures/hash/hash-map.js.map +1 -1
- package/dist/cjs/data-structures/heap/heap.d.ts +20 -3
- package/dist/cjs/data-structures/heap/heap.js +31 -11
- package/dist/cjs/data-structures/heap/heap.js.map +1 -1
- package/dist/cjs/data-structures/linked-list/doubly-linked-list.d.ts +46 -11
- package/dist/cjs/data-structures/linked-list/doubly-linked-list.js +68 -21
- package/dist/cjs/data-structures/linked-list/doubly-linked-list.js.map +1 -1
- package/dist/cjs/data-structures/linked-list/singly-linked-list.d.ts +44 -11
- package/dist/cjs/data-structures/linked-list/singly-linked-list.js +70 -26
- package/dist/cjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
- package/dist/cjs/data-structures/queue/deque.d.ts +37 -8
- package/dist/cjs/data-structures/queue/deque.js +73 -29
- package/dist/cjs/data-structures/queue/deque.js.map +1 -1
- package/dist/cjs/data-structures/queue/queue.d.ts +41 -1
- package/dist/cjs/data-structures/queue/queue.js +51 -9
- package/dist/cjs/data-structures/queue/queue.js.map +1 -1
- package/dist/cjs/data-structures/stack/stack.d.ts +27 -10
- package/dist/cjs/data-structures/stack/stack.js +39 -20
- package/dist/cjs/data-structures/stack/stack.js.map +1 -1
- package/dist/cjs/data-structures/trie/trie.d.ts +12 -13
- package/dist/cjs/data-structures/trie/trie.js +12 -13
- package/dist/cjs/data-structures/trie/trie.js.map +1 -1
- package/dist/cjs/interfaces/binary-tree.d.ts +3 -4
- package/dist/cjs/types/data-structures/base/base.d.ts +1 -1
- package/dist/cjs/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +2 -3
- package/dist/cjs/types/data-structures/binary-tree/avl-tree.d.ts +2 -3
- package/dist/cjs/types/data-structures/binary-tree/binary-tree.d.ts +2 -3
- package/dist/cjs/types/data-structures/binary-tree/bst.d.ts +3 -4
- package/dist/cjs/types/data-structures/binary-tree/rb-tree.d.ts +4 -5
- package/dist/cjs/types/data-structures/binary-tree/tree-multi-map.d.ts +4 -5
- package/dist/mjs/common/index.js +5 -0
- package/dist/mjs/common/index.js.map +1 -1
- package/dist/mjs/data-structures/base/iterable-entry-base.js +4 -4
- package/dist/mjs/data-structures/base/iterable-entry-base.js.map +1 -1
- package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +36 -17
- package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.js +65 -36
- package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -1
- package/dist/mjs/data-structures/binary-tree/avl-tree.d.ts +12 -8
- package/dist/mjs/data-structures/binary-tree/avl-tree.js +19 -6
- package/dist/mjs/data-structures/binary-tree/avl-tree.js.map +1 -1
- package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +53 -40
- package/dist/mjs/data-structures/binary-tree/binary-tree.js +76 -72
- package/dist/mjs/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/mjs/data-structures/binary-tree/bst.d.ts +87 -52
- package/dist/mjs/data-structures/binary-tree/bst.js +127 -79
- package/dist/mjs/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/mjs/data-structures/binary-tree/index.d.ts +1 -1
- package/dist/mjs/data-structures/binary-tree/index.js +1 -1
- package/dist/mjs/data-structures/binary-tree/index.js.map +1 -1
- package/dist/mjs/data-structures/binary-tree/{rb-tree.d.ts → red-black-tree.d.ts} +83 -10
- package/dist/mjs/data-structures/binary-tree/{rb-tree.js → red-black-tree.js} +92 -45
- package/dist/mjs/data-structures/binary-tree/red-black-tree.js.map +1 -0
- package/dist/mjs/data-structures/binary-tree/tree-multi-map.d.ts +34 -18
- package/dist/mjs/data-structures/binary-tree/tree-multi-map.js +64 -38
- package/dist/mjs/data-structures/binary-tree/tree-multi-map.js.map +1 -1
- package/dist/mjs/data-structures/graph/abstract-graph.js +2 -2
- package/dist/mjs/data-structures/graph/abstract-graph.js.map +1 -1
- package/dist/mjs/data-structures/hash/hash-map.d.ts +31 -1
- package/dist/mjs/data-structures/hash/hash-map.js +35 -5
- package/dist/mjs/data-structures/hash/hash-map.js.map +1 -1
- package/dist/mjs/data-structures/heap/heap.d.ts +20 -3
- package/dist/mjs/data-structures/heap/heap.js +31 -11
- package/dist/mjs/data-structures/heap/heap.js.map +1 -1
- package/dist/mjs/data-structures/linked-list/doubly-linked-list.d.ts +46 -11
- package/dist/mjs/data-structures/linked-list/doubly-linked-list.js +68 -21
- package/dist/mjs/data-structures/linked-list/doubly-linked-list.js.map +1 -1
- package/dist/mjs/data-structures/linked-list/singly-linked-list.d.ts +44 -11
- package/dist/mjs/data-structures/linked-list/singly-linked-list.js +70 -26
- package/dist/mjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
- package/dist/mjs/data-structures/queue/deque.d.ts +37 -8
- package/dist/mjs/data-structures/queue/deque.js +73 -29
- package/dist/mjs/data-structures/queue/deque.js.map +1 -1
- package/dist/mjs/data-structures/queue/queue.d.ts +41 -1
- package/dist/mjs/data-structures/queue/queue.js +51 -9
- package/dist/mjs/data-structures/queue/queue.js.map +1 -1
- package/dist/mjs/data-structures/stack/stack.d.ts +27 -10
- package/dist/mjs/data-structures/stack/stack.js +39 -20
- package/dist/mjs/data-structures/stack/stack.js.map +1 -1
- package/dist/mjs/data-structures/trie/trie.d.ts +12 -13
- package/dist/mjs/data-structures/trie/trie.js +12 -13
- package/dist/mjs/data-structures/trie/trie.js.map +1 -1
- package/dist/mjs/interfaces/binary-tree.d.ts +3 -4
- package/dist/mjs/types/data-structures/base/base.d.ts +1 -1
- package/dist/mjs/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +2 -3
- package/dist/mjs/types/data-structures/binary-tree/avl-tree.d.ts +2 -3
- package/dist/mjs/types/data-structures/binary-tree/binary-tree.d.ts +2 -3
- package/dist/mjs/types/data-structures/binary-tree/bst.d.ts +3 -4
- package/dist/mjs/types/data-structures/binary-tree/rb-tree.d.ts +4 -5
- package/dist/mjs/types/data-structures/binary-tree/tree-multi-map.d.ts +4 -5
- package/dist/umd/data-structure-typed.js +722 -356
- package/dist/umd/data-structure-typed.min.js +3 -3
- package/dist/umd/data-structure-typed.min.js.map +1 -1
- package/package.json +6 -6
- package/src/common/index.ts +7 -1
- package/src/data-structures/base/iterable-entry-base.ts +4 -4
- package/src/data-structures/binary-tree/avl-tree-multi-map.ts +82 -55
- package/src/data-structures/binary-tree/avl-tree.ts +32 -15
- package/src/data-structures/binary-tree/binary-tree.ts +89 -84
- package/src/data-structures/binary-tree/bst.ts +149 -97
- package/src/data-structures/binary-tree/index.ts +1 -1
- package/src/data-structures/binary-tree/{rb-tree.ts → red-black-tree.ts} +105 -55
- package/src/data-structures/binary-tree/tree-multi-map.ts +81 -51
- package/src/data-structures/graph/abstract-graph.ts +2 -2
- package/src/data-structures/hash/hash-map.ts +37 -7
- package/src/data-structures/heap/heap.ts +33 -10
- package/src/data-structures/linked-list/doubly-linked-list.ts +75 -21
- package/src/data-structures/linked-list/singly-linked-list.ts +77 -27
- package/src/data-structures/queue/deque.ts +72 -28
- package/src/data-structures/queue/queue.ts +50 -7
- package/src/data-structures/stack/stack.ts +39 -20
- package/src/data-structures/trie/trie.ts +8 -3
- package/src/interfaces/binary-tree.ts +3 -13
- package/src/types/data-structures/base/base.ts +1 -1
- package/src/types/data-structures/binary-tree/avl-tree-multi-map.ts +2 -4
- package/src/types/data-structures/binary-tree/avl-tree.ts +2 -4
- package/src/types/data-structures/binary-tree/binary-tree.ts +3 -3
- package/src/types/data-structures/binary-tree/bst.ts +3 -5
- package/src/types/data-structures/binary-tree/rb-tree.ts +4 -6
- package/src/types/data-structures/binary-tree/tree-multi-map.ts +4 -6
- package/test/integration/index.html +3 -3
- package/test/performance/data-structures/binary-tree/binary-tree-overall.test.ts +3 -3
- package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +12 -12
- package/test/unit/data-structures/binary-tree/avl-tree.test.ts +10 -10
- package/test/unit/data-structures/binary-tree/binary-tree.test.ts +45 -45
- package/test/unit/data-structures/binary-tree/bst.test.ts +90 -96
- package/test/unit/data-structures/binary-tree/data/cost-of-living-by-country.ts +259 -0
- package/test/unit/data-structures/binary-tree/overall.test.ts +2 -0
- package/test/unit/data-structures/binary-tree/{rb-tree.test.ts → red-black-tree.test.ts} +67 -92
- package/test/unit/data-structures/binary-tree/tree-multi-map.test.ts +10 -10
- package/test/unit/data-structures/graph/directed-graph.test.ts +4 -4
- package/test/unit/data-structures/hash/hash-map.test.ts +12 -12
- package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +0 -1
- package/dist/mjs/data-structures/binary-tree/rb-tree.js.map +0 -1
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type {
|
|
1
|
+
import { TreeMultiMapNode } from '../../../data-structures';
|
|
2
|
+
import type { RedBlackTreeOptions } from './rb-tree';
|
|
3
3
|
|
|
4
|
-
export type TreeMultiMapNodeNested<K, V> = TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V,
|
|
4
|
+
export type TreeMultiMapNodeNested<K, V> = TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, any>>>>>>>>>>
|
|
5
5
|
|
|
6
|
-
export type
|
|
7
|
-
|
|
8
|
-
export type TreeMultiMapOptions<K, V, R> = RBTreeOptions<K, V, R> & {}
|
|
6
|
+
export type TreeMultiMapOptions<K, V, R> = RedBlackTreeOptions<K, V, R> & {}
|
|
@@ -102,7 +102,7 @@
|
|
|
102
102
|
try {
|
|
103
103
|
const { OrderedMap } = sdsl;
|
|
104
104
|
const { RedBlackTree } = dataStructureTyped;
|
|
105
|
-
const
|
|
105
|
+
const cRedBlackTree = new OrderedMap();
|
|
106
106
|
const rbTree = new RedBlackTree();
|
|
107
107
|
const tS = performance.now();
|
|
108
108
|
const n = 100000;
|
|
@@ -117,10 +117,10 @@
|
|
|
117
117
|
rbTree.print(rbTree.root, { isShowRedBlackNIL: true });
|
|
118
118
|
const cS = performance.now();
|
|
119
119
|
for (let i = 1; i < 100000; i++) {
|
|
120
|
-
|
|
120
|
+
cRedBlackTree.setElement(i, i);
|
|
121
121
|
}
|
|
122
122
|
console.log((performance.now() - cS).toFixed(2), `CRedBlackTree ${n.toLocaleString()} add`);
|
|
123
|
-
console.log(
|
|
123
|
+
console.log(cRedBlackTree.size(), `cRedBlackTree.size()`);
|
|
124
124
|
} catch (e) {
|
|
125
125
|
console.error(e);
|
|
126
126
|
}
|
|
@@ -9,14 +9,14 @@ const { TEN_THOUSAND } = magnitude;
|
|
|
9
9
|
const arr = getRandomIntArray(TEN_THOUSAND, 0, TEN_THOUSAND - 1, true);
|
|
10
10
|
|
|
11
11
|
suite
|
|
12
|
-
.add(`${TEN_THOUSAND.toLocaleString()}
|
|
12
|
+
.add(`${TEN_THOUSAND.toLocaleString()} RedBlackTree add randomly`, () => {
|
|
13
13
|
rbTree.clear();
|
|
14
14
|
for (let i = 0; i < arr.length; i++) rbTree.add(arr[i]);
|
|
15
15
|
})
|
|
16
|
-
.add(`${TEN_THOUSAND.toLocaleString()}
|
|
16
|
+
.add(`${TEN_THOUSAND.toLocaleString()} RedBlackTree get randomly`, () => {
|
|
17
17
|
for (let i = 0; i < arr.length; i++) rbTree.get(arr[i]);
|
|
18
18
|
})
|
|
19
|
-
.add(`${TEN_THOUSAND.toLocaleString()}
|
|
19
|
+
.add(`${TEN_THOUSAND.toLocaleString()} RedBlackTree add & delete randomly`, () => {
|
|
20
20
|
rbTree.clear();
|
|
21
21
|
for (let i = 0; i < arr.length; i++) rbTree.add(arr[i]);
|
|
22
22
|
for (let i = 0; i < arr.length; i++) rbTree.delete(arr[i]);
|
|
@@ -626,18 +626,18 @@ describe('AVLTreeMultiMap iterative methods test', () => {
|
|
|
626
626
|
|
|
627
627
|
it('forEach should iterate over all elements', () => {
|
|
628
628
|
const mockCallback = jest.fn();
|
|
629
|
-
treeMM.forEach((
|
|
630
|
-
mockCallback(
|
|
629
|
+
treeMM.forEach((key, value) => {
|
|
630
|
+
mockCallback(key, value);
|
|
631
631
|
});
|
|
632
632
|
|
|
633
633
|
expect(mockCallback.mock.calls.length).toBe(3);
|
|
634
|
-
expect(mockCallback.mock.calls[0]).toEqual(['a'
|
|
635
|
-
expect(mockCallback.mock.calls[1]).toEqual(['b'
|
|
636
|
-
expect(mockCallback.mock.calls[2]).toEqual(['c'
|
|
634
|
+
expect(mockCallback.mock.calls[0]).toEqual([1, 'a']);
|
|
635
|
+
expect(mockCallback.mock.calls[1]).toEqual([2, 'b']);
|
|
636
|
+
expect(mockCallback.mock.calls[2]).toEqual([3, 'c']);
|
|
637
637
|
});
|
|
638
638
|
|
|
639
639
|
it('filter should return a new tree with filtered elements', () => {
|
|
640
|
-
const filteredTree = treeMM.filter(
|
|
640
|
+
const filteredTree = treeMM.filter(key => key > 1);
|
|
641
641
|
expect(filteredTree.size).toBe(2);
|
|
642
642
|
expect([...filteredTree]).toEqual([
|
|
643
643
|
[2, 'b'],
|
|
@@ -646,12 +646,12 @@ describe('AVLTreeMultiMap iterative methods test', () => {
|
|
|
646
646
|
});
|
|
647
647
|
|
|
648
648
|
it('map should return a new tree with modified elements', () => {
|
|
649
|
-
const mappedTree = treeMM.map((
|
|
649
|
+
const mappedTree = treeMM.map((key, value) => [(key * 2).toString(), value]);
|
|
650
650
|
expect(mappedTree.size).toBe(3);
|
|
651
651
|
expect([...mappedTree]).toEqual([
|
|
652
|
-
[
|
|
653
|
-
[
|
|
654
|
-
[
|
|
652
|
+
['2', 'a'],
|
|
653
|
+
['4', 'b'],
|
|
654
|
+
['6', 'c']
|
|
655
655
|
]);
|
|
656
656
|
});
|
|
657
657
|
|
|
@@ -736,7 +736,7 @@ describe('AVLTree toEntryFn', () => {
|
|
|
736
736
|
{ obj: { id: 5 } }
|
|
737
737
|
])
|
|
738
738
|
).toThrowError(
|
|
739
|
-
`When comparing object types, a custom
|
|
739
|
+
`When comparing object types, a custom specifyComparable must be defined in the constructor's options parameter.`
|
|
740
740
|
);
|
|
741
741
|
});
|
|
742
742
|
|
|
@@ -744,7 +744,7 @@ describe('AVLTree toEntryFn', () => {
|
|
|
744
744
|
const tree = new AVLTreeMultiMap<{ obj: { id: number } }, number>(
|
|
745
745
|
[{ obj: { id: 1 } }, { obj: { id: 2 } }, { obj: { id: 3 } }, { obj: { id: 4 } }, { obj: { id: 5 } }],
|
|
746
746
|
{
|
|
747
|
-
|
|
747
|
+
specifyComparable: key => key.obj.id
|
|
748
748
|
}
|
|
749
749
|
);
|
|
750
750
|
|
|
@@ -386,18 +386,18 @@ describe('AVLTree iterative methods test', () => {
|
|
|
386
386
|
|
|
387
387
|
it('forEach should iterate over all elements', () => {
|
|
388
388
|
const mockCallback = jest.fn();
|
|
389
|
-
avl.forEach((
|
|
390
|
-
mockCallback(
|
|
389
|
+
avl.forEach((key, value) => {
|
|
390
|
+
mockCallback(key, value);
|
|
391
391
|
});
|
|
392
392
|
|
|
393
393
|
expect(mockCallback.mock.calls.length).toBe(3);
|
|
394
|
-
expect(mockCallback.mock.calls[0]).toEqual(['a'
|
|
395
|
-
expect(mockCallback.mock.calls[1]).toEqual(['b'
|
|
396
|
-
expect(mockCallback.mock.calls[2]).toEqual(['c'
|
|
394
|
+
expect(mockCallback.mock.calls[0]).toEqual([1, 'a']);
|
|
395
|
+
expect(mockCallback.mock.calls[1]).toEqual([2, 'b']);
|
|
396
|
+
expect(mockCallback.mock.calls[2]).toEqual([3, 'c']);
|
|
397
397
|
});
|
|
398
398
|
|
|
399
399
|
it('filter should return a new tree with filtered elements', () => {
|
|
400
|
-
const filteredTree = avl.filter(
|
|
400
|
+
const filteredTree = avl.filter(key => key > 1);
|
|
401
401
|
expect(filteredTree.size).toBe(2);
|
|
402
402
|
expect([...filteredTree]).toEqual([
|
|
403
403
|
[2, 'b'],
|
|
@@ -406,12 +406,12 @@ describe('AVLTree iterative methods test', () => {
|
|
|
406
406
|
});
|
|
407
407
|
|
|
408
408
|
it('map should return a new tree with modified elements', () => {
|
|
409
|
-
const mappedTree = avl.map((
|
|
409
|
+
const mappedTree = avl.map((key, value) => [(key * 2).toString(), value]);
|
|
410
410
|
expect(mappedTree.size).toBe(3);
|
|
411
411
|
expect([...mappedTree]).toEqual([
|
|
412
|
-
[
|
|
413
|
-
[
|
|
414
|
-
[
|
|
412
|
+
['2', 'a'],
|
|
413
|
+
['4', 'b'],
|
|
414
|
+
['6', 'c']
|
|
415
415
|
]);
|
|
416
416
|
});
|
|
417
417
|
|
|
@@ -733,41 +733,41 @@ describe('BinaryTree', () => {
|
|
|
733
733
|
]);
|
|
734
734
|
});
|
|
735
735
|
|
|
736
|
-
it('should keyValueNodeEntryRawToNodeAndValue', () => {
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
});
|
|
736
|
+
// it('should keyValueNodeEntryRawToNodeAndValue', () => {
|
|
737
|
+
// const tree = new BinaryTree<number>();
|
|
738
|
+
// const node0 = tree.keyValueNodeEntryRawToNodeAndValue(0);
|
|
739
|
+
// expect(node0).toEqual([
|
|
740
|
+
// {
|
|
741
|
+
// _left: undefined,
|
|
742
|
+
// _right: undefined,
|
|
743
|
+
// key: 0,
|
|
744
|
+
// parent: undefined,
|
|
745
|
+
// value: undefined
|
|
746
|
+
// },
|
|
747
|
+
// undefined
|
|
748
|
+
// ]);
|
|
749
|
+
//
|
|
750
|
+
// const nodeUndefined = tree.keyValueNodeEntryRawToNodeAndValue(undefined);
|
|
751
|
+
// expect(nodeUndefined).toEqual([undefined, undefined]);
|
|
752
|
+
//
|
|
753
|
+
// const nodeNull = tree.keyValueNodeEntryRawToNodeAndValue(null);
|
|
754
|
+
// expect(nodeNull).toEqual([null, undefined]);
|
|
755
|
+
//
|
|
756
|
+
// const [, nodeWithSeparateValue] = tree.keyValueNodeEntryRawToNodeAndValue(7, 77);
|
|
757
|
+
// expect(nodeWithSeparateValue).toBe(77);
|
|
758
|
+
//
|
|
759
|
+
// expect(tree.keyValueNodeEntryRawToNodeAndValue([undefined, 2])).toEqual([undefined, undefined]);
|
|
760
|
+
//
|
|
761
|
+
// expect(tree.keyValueNodeEntryRawToNodeAndValue(Symbol('test') as unknown as number)).toEqual([
|
|
762
|
+
// undefined,
|
|
763
|
+
// undefined
|
|
764
|
+
// ]);
|
|
765
|
+
//
|
|
766
|
+
// const bTree = new BinaryTree<number, number, { obj: { id: number } }>([], {
|
|
767
|
+
// toEntryFn: (ele: { obj: { id: number } }) => [Symbol('test') as unknown as number, ele.obj.id]
|
|
768
|
+
// });
|
|
769
|
+
// expect(bTree.keyValueNodeEntryRawToNodeAndValue({ obj: { id: 1 } })).toEqual([undefined, undefined]);
|
|
770
|
+
// });
|
|
771
771
|
|
|
772
772
|
it('should replace value', () => {
|
|
773
773
|
const tree = new BinaryTree<number, string>([4, 5, [1, '1'], 2, 3], { isMapMode: false });
|
|
@@ -1342,18 +1342,18 @@ describe('BinaryTree iterative methods test', () => {
|
|
|
1342
1342
|
|
|
1343
1343
|
it('forEach should iterate over all elements', () => {
|
|
1344
1344
|
const mockCallback = jest.fn();
|
|
1345
|
-
binaryTree.forEach((
|
|
1346
|
-
mockCallback(
|
|
1345
|
+
binaryTree.forEach((key, value) => {
|
|
1346
|
+
mockCallback(key, value);
|
|
1347
1347
|
});
|
|
1348
1348
|
|
|
1349
1349
|
expect(mockCallback.mock.calls.length).toBe(3);
|
|
1350
|
-
expect(mockCallback.mock.calls[0]).toEqual(['b'
|
|
1351
|
-
expect(mockCallback.mock.calls[1]).toEqual(['a'
|
|
1352
|
-
expect(mockCallback.mock.calls[2]).toEqual(['c'
|
|
1350
|
+
expect(mockCallback.mock.calls[0]).toEqual([2, 'b']);
|
|
1351
|
+
expect(mockCallback.mock.calls[1]).toEqual([1, 'a']);
|
|
1352
|
+
expect(mockCallback.mock.calls[2]).toEqual([3, 'c']);
|
|
1353
1353
|
});
|
|
1354
1354
|
|
|
1355
1355
|
it('filter should return a new tree with filtered elements', () => {
|
|
1356
|
-
const filteredTree = binaryTree.filter((
|
|
1356
|
+
const filteredTree = binaryTree.filter((key, value) => key > 1);
|
|
1357
1357
|
expect(filteredTree.size).toBe(2);
|
|
1358
1358
|
expect([...filteredTree]).toEqual([
|
|
1359
1359
|
[3, 'c'],
|
|
@@ -1362,12 +1362,12 @@ describe('BinaryTree iterative methods test', () => {
|
|
|
1362
1362
|
});
|
|
1363
1363
|
|
|
1364
1364
|
it('map should return a new tree with modified elements', () => {
|
|
1365
|
-
const mappedTree = binaryTree.map((
|
|
1365
|
+
const mappedTree = binaryTree.map((key, value) => [(key * 2).toString(), value]);
|
|
1366
1366
|
expect(mappedTree.size).toBe(3);
|
|
1367
1367
|
expect([...mappedTree]).toEqual([
|
|
1368
|
-
[
|
|
1369
|
-
[
|
|
1370
|
-
[
|
|
1368
|
+
['2', 'a'],
|
|
1369
|
+
['4', 'b'],
|
|
1370
|
+
['6', 'c']
|
|
1371
1371
|
]);
|
|
1372
1372
|
});
|
|
1373
1373
|
|
|
@@ -58,7 +58,7 @@ describe('BST operations test', () => {
|
|
|
58
58
|
[10, 10],
|
|
59
59
|
[5, 5]
|
|
60
60
|
];
|
|
61
|
-
bst.addMany(idsAndValues,
|
|
61
|
+
bst.addMany(idsAndValues, [], false);
|
|
62
62
|
expect(bst.root).toBeInstanceOf(BSTNode);
|
|
63
63
|
|
|
64
64
|
if (bst.root) expect(bst.root.key).toBe(11);
|
|
@@ -450,26 +450,26 @@ describe('BST operations test', () => {
|
|
|
450
450
|
expect(bfsNodes[2].key).toBe(16);
|
|
451
451
|
});
|
|
452
452
|
|
|
453
|
-
it('should keyValueNodeEntryRawToNodeAndValue', () => {
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
});
|
|
453
|
+
// it('should keyValueNodeEntryRawToNodeAndValue', () => {
|
|
454
|
+
// const bst = new BST<number>();
|
|
455
|
+
// const node0 = bst.keyValueNodeEntryRawToNodeAndValue(0);
|
|
456
|
+
// expect(node0).toEqual([
|
|
457
|
+
// {
|
|
458
|
+
// _left: undefined,
|
|
459
|
+
// _right: undefined,
|
|
460
|
+
// key: 0,
|
|
461
|
+
// parent: undefined,
|
|
462
|
+
// value: undefined
|
|
463
|
+
// },
|
|
464
|
+
// undefined
|
|
465
|
+
// ]);
|
|
466
|
+
//
|
|
467
|
+
// const nodeUndefined = bst.keyValueNodeEntryRawToNodeAndValue(undefined);
|
|
468
|
+
// expect(nodeUndefined).toEqual([undefined, undefined]);
|
|
469
|
+
//
|
|
470
|
+
// const nodeNull = bst.keyValueNodeEntryRawToNodeAndValue(null);
|
|
471
|
+
// expect(nodeNull).toEqual([undefined, undefined]);
|
|
472
|
+
// });
|
|
473
473
|
|
|
474
474
|
it('should replace value', () => {
|
|
475
475
|
const tree = new BST<number, string>([4, 5, [1, '1'], 2, 3], { isMapMode: false });
|
|
@@ -489,6 +489,13 @@ describe('BST operations test', () => {
|
|
|
489
489
|
expect(treeMap.getNode(1)?.value).toBe(undefined);
|
|
490
490
|
expect(treeMap.get(1)).toBe('b');
|
|
491
491
|
});
|
|
492
|
+
|
|
493
|
+
it('should search in range', () => {
|
|
494
|
+
const bst = new BST<number>([10, 5, 15, 3, 7, 12, 18]);
|
|
495
|
+
expect(bst.rangeSearch([4, 12])).toEqual([10, 12, 5, 7]);
|
|
496
|
+
expect(() => bst.rangeSearch([12, 4])).toThrow('low must be less than or equal to high');
|
|
497
|
+
expect(bst.rangeSearch([12, 12])).toEqual([12]);
|
|
498
|
+
});
|
|
492
499
|
});
|
|
493
500
|
|
|
494
501
|
describe('BST operations test recursively', () => {
|
|
@@ -974,7 +981,7 @@ describe('BST operations test recursively', () => {
|
|
|
974
981
|
|
|
975
982
|
if (isTestStackOverflow) {
|
|
976
983
|
it('should getLeftMost', () => {
|
|
977
|
-
const bst = new BST<number>([], {
|
|
984
|
+
const bst = new BST<number>([], { specifyComparable: key => key });
|
|
978
985
|
for (let i = 1; i <= SYSTEM_MAX_CALL_STACK; i++) bst.add(i);
|
|
979
986
|
|
|
980
987
|
expect(() => {
|
|
@@ -1103,18 +1110,18 @@ describe('BST iterative methods test', () => {
|
|
|
1103
1110
|
|
|
1104
1111
|
it('forEach should iterate over all elements', () => {
|
|
1105
1112
|
const mockCallback = jest.fn();
|
|
1106
|
-
bst.forEach((
|
|
1107
|
-
mockCallback(
|
|
1113
|
+
bst.forEach((key, value) => {
|
|
1114
|
+
mockCallback(key, value);
|
|
1108
1115
|
});
|
|
1109
1116
|
|
|
1110
1117
|
expect(mockCallback.mock.calls.length).toBe(3);
|
|
1111
|
-
expect(mockCallback.mock.calls[0]).toEqual(['a'
|
|
1112
|
-
expect(mockCallback.mock.calls[1]).toEqual(['b'
|
|
1113
|
-
expect(mockCallback.mock.calls[2]).toEqual(['c'
|
|
1118
|
+
expect(mockCallback.mock.calls[0]).toEqual([1, 'a']);
|
|
1119
|
+
expect(mockCallback.mock.calls[1]).toEqual([2, 'b']);
|
|
1120
|
+
expect(mockCallback.mock.calls[2]).toEqual([3, 'c']);
|
|
1114
1121
|
});
|
|
1115
1122
|
|
|
1116
1123
|
it('filter should return a new tree with filtered elements', () => {
|
|
1117
|
-
const filteredTree = bst.filter((
|
|
1124
|
+
const filteredTree = bst.filter((key, value) => key > 1);
|
|
1118
1125
|
expect(filteredTree.size).toBe(2);
|
|
1119
1126
|
expect([...filteredTree]).toEqual([
|
|
1120
1127
|
[2, 'b'],
|
|
@@ -1123,12 +1130,12 @@ describe('BST iterative methods test', () => {
|
|
|
1123
1130
|
});
|
|
1124
1131
|
|
|
1125
1132
|
it('map should return a new tree with modified elements', () => {
|
|
1126
|
-
const mappedTree = bst.map((
|
|
1133
|
+
const mappedTree = bst.map((key, value) => [(key * 2).toString(), value]);
|
|
1127
1134
|
expect(mappedTree.size).toBe(3);
|
|
1128
1135
|
expect([...mappedTree]).toEqual([
|
|
1129
|
-
[
|
|
1130
|
-
[
|
|
1131
|
-
[
|
|
1136
|
+
['2', 'a'],
|
|
1137
|
+
['4', 'b'],
|
|
1138
|
+
['6', 'c']
|
|
1132
1139
|
]);
|
|
1133
1140
|
});
|
|
1134
1141
|
|
|
@@ -1340,26 +1347,26 @@ describe('BST operations not map mode test', () => {
|
|
|
1340
1347
|
});
|
|
1341
1348
|
});
|
|
1342
1349
|
|
|
1343
|
-
it('should keyValueNodeEntryRawToNodeAndValue', () => {
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
});
|
|
1350
|
+
// it('should keyValueNodeEntryRawToNodeAndValue', () => {
|
|
1351
|
+
// const bst = new BST<number>([], { isMapMode: false });
|
|
1352
|
+
// const node0 = bst.keyValueNodeEntryRawToNodeAndValue(0);
|
|
1353
|
+
// expect(node0).toEqual([
|
|
1354
|
+
// {
|
|
1355
|
+
// _left: undefined,
|
|
1356
|
+
// _right: undefined,
|
|
1357
|
+
// key: 0,
|
|
1358
|
+
// parent: undefined,
|
|
1359
|
+
// value: undefined
|
|
1360
|
+
// },
|
|
1361
|
+
// undefined
|
|
1362
|
+
// ]);
|
|
1363
|
+
//
|
|
1364
|
+
// const nodeUndefined = bst.keyValueNodeEntryRawToNodeAndValue(undefined);
|
|
1365
|
+
// expect(nodeUndefined).toEqual([undefined, undefined]);
|
|
1366
|
+
//
|
|
1367
|
+
// const nodeNull = bst.keyValueNodeEntryRawToNodeAndValue(null);
|
|
1368
|
+
// expect(nodeNull).toEqual([undefined, undefined]);
|
|
1369
|
+
// });
|
|
1363
1370
|
});
|
|
1364
1371
|
|
|
1365
1372
|
describe('BST operations not map mode test recursively', () => {
|
|
@@ -1531,57 +1538,52 @@ describe('BST iterative methods not map mode test', () => {
|
|
|
1531
1538
|
});
|
|
1532
1539
|
|
|
1533
1540
|
describe('classic use', () => {
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1541
|
+
it('@example Merge 3 sorted datasets', () => {
|
|
1542
|
+
const dataset1 = new BST<number, string>([
|
|
1543
|
+
[1, 'A'],
|
|
1544
|
+
[7, 'G']
|
|
1545
|
+
]);
|
|
1546
|
+
const dataset2 = [
|
|
1547
|
+
[2, 'B'],
|
|
1548
|
+
[6, 'F']
|
|
1549
|
+
];
|
|
1550
|
+
const dataset3 = new BST<number, string>([
|
|
1551
|
+
[3, 'C'],
|
|
1552
|
+
[5, 'E'],
|
|
1553
|
+
[4, 'D']
|
|
1554
|
+
]);
|
|
1544
1555
|
|
|
1545
|
-
//
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1556
|
+
// Merge datasets into a single BinarySearchTree
|
|
1557
|
+
const merged = new BST<number, string>(dataset1);
|
|
1558
|
+
merged.addMany(dataset2);
|
|
1559
|
+
merged.merge(dataset3);
|
|
1560
|
+
|
|
1561
|
+
// Verify merged dataset is in sorted order
|
|
1562
|
+
expect([...merged.values()]).toEqual(['A', 'B', 'C', 'D', 'E', 'F', 'G']);
|
|
1549
1563
|
});
|
|
1550
1564
|
|
|
1551
1565
|
// Test case for finding elements in a given range
|
|
1552
1566
|
it('@example Find elements in a range', () => {
|
|
1553
1567
|
const bst = new BST<number>([10, 5, 15, 3, 7, 12, 18]);
|
|
1554
1568
|
expect(bst.search(new Range(5, 10))).toEqual([10, 5, 7]);
|
|
1555
|
-
expect(bst.
|
|
1569
|
+
expect(bst.rangeSearch([4, 12], node => node.key.toString())).toEqual(['10', '12', '5', '7']);
|
|
1556
1570
|
expect(bst.search(new Range(4, 12, true, false))).toEqual([10, 5, 7]);
|
|
1557
|
-
expect(bst.
|
|
1571
|
+
expect(bst.rangeSearch([15, 20])).toEqual([15, 18]);
|
|
1558
1572
|
expect(bst.search(new Range(15, 20, false))).toEqual([18]);
|
|
1559
1573
|
});
|
|
1560
1574
|
|
|
1561
|
-
// Test case for Huffman coding simulation
|
|
1562
|
-
it('Huffman coding frequency simulation', () => {
|
|
1563
|
-
// Create a BST to simulate Huffman tree
|
|
1564
|
-
const frequencyBST = new BST<string, number>([
|
|
1565
|
-
['a', 5],
|
|
1566
|
-
['b', 9],
|
|
1567
|
-
['c', 12],
|
|
1568
|
-
['d', 13],
|
|
1569
|
-
['e', 16],
|
|
1570
|
-
['f', 45]
|
|
1571
|
-
]);
|
|
1572
|
-
|
|
1573
|
-
// Sort nodes by frequency
|
|
1574
|
-
const sortedFrequencies = frequencyBST.dfs(node => ({ char: node.key, freq: node.value }), 'IN');
|
|
1575
|
-
|
|
1576
|
-
// Build Huffman tree simulation
|
|
1577
|
-
expect(sortedFrequencies[0].char).toBe('a');
|
|
1578
|
-
expect(sortedFrequencies[5].char).toBe('f');
|
|
1579
|
-
});
|
|
1580
|
-
|
|
1581
1575
|
// Test case for Lowest Common Ancestor (LCA)
|
|
1582
1576
|
it('@example Find lowest common ancestor', () => {
|
|
1583
1577
|
const bst = new BST<number>([20, 10, 30, 5, 15, 25, 35, 3, 7, 12, 18]);
|
|
1584
1578
|
|
|
1579
|
+
// LCA helper function
|
|
1580
|
+
const findLCA = (num1: number, num2: number): number | undefined => {
|
|
1581
|
+
const path1 = bst.getPathToRoot(num1);
|
|
1582
|
+
const path2 = bst.getPathToRoot(num2);
|
|
1583
|
+
// Find the first common ancestor
|
|
1584
|
+
return findFirstCommon(path1, path2);
|
|
1585
|
+
};
|
|
1586
|
+
|
|
1585
1587
|
function findFirstCommon(arr1: number[], arr2: number[]): number | undefined {
|
|
1586
1588
|
for (const num of arr1) {
|
|
1587
1589
|
if (arr2.indexOf(num) !== -1) {
|
|
@@ -1591,14 +1593,6 @@ describe('classic use', () => {
|
|
|
1591
1593
|
return undefined;
|
|
1592
1594
|
}
|
|
1593
1595
|
|
|
1594
|
-
// LCA helper function
|
|
1595
|
-
const findLCA = (num1: number, num2: number): number | undefined => {
|
|
1596
|
-
const path1 = bst.getPathToRoot(num1);
|
|
1597
|
-
const path2 = bst.getPathToRoot(num2);
|
|
1598
|
-
// Find the first common ancestor
|
|
1599
|
-
return findFirstCommon(path1, path2);
|
|
1600
|
-
};
|
|
1601
|
-
|
|
1602
1596
|
// Assertions
|
|
1603
1597
|
expect(findLCA(3, 10)).toBe(7);
|
|
1604
1598
|
expect(findLCA(5, 35)).toBe(15);
|