data-structure-typed 1.52.9 → 1.53.1
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/README.md +13 -13
- package/benchmark/report.html +1 -37
- package/benchmark/report.json +24 -384
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +21 -21
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js +64 -47
- 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 +20 -20
- package/dist/cjs/data-structures/binary-tree/avl-tree.js +29 -27
- package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +186 -144
- package/dist/cjs/data-structures/binary-tree/binary-tree.js +376 -265
- package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/bst.d.ts +56 -56
- package/dist/cjs/data-structures/binary-tree/bst.js +108 -78
- package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/rb-tree.d.ts +13 -13
- package/dist/cjs/data-structures/binary-tree/rb-tree.js +42 -36
- package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.d.ts +21 -21
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.js +59 -49
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.js.map +1 -1
- package/dist/cjs/data-structures/trie/trie.js +3 -3
- package/dist/cjs/interfaces/binary-tree.d.ts +5 -5
- package/dist/cjs/types/data-structures/binary-tree/binary-tree.d.ts +13 -13
- package/dist/cjs/types/data-structures/binary-tree/bst.d.ts +3 -3
- package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +21 -21
- package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.js +64 -46
- package/dist/mjs/data-structures/binary-tree/avl-tree.d.ts +20 -20
- package/dist/mjs/data-structures/binary-tree/avl-tree.js +29 -26
- package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +186 -144
- package/dist/mjs/data-structures/binary-tree/binary-tree.js +376 -264
- package/dist/mjs/data-structures/binary-tree/bst.d.ts +56 -56
- package/dist/mjs/data-structures/binary-tree/bst.js +108 -76
- package/dist/mjs/data-structures/binary-tree/rb-tree.d.ts +13 -13
- package/dist/mjs/data-structures/binary-tree/rb-tree.js +42 -35
- package/dist/mjs/data-structures/binary-tree/tree-multi-map.d.ts +21 -21
- package/dist/mjs/data-structures/binary-tree/tree-multi-map.js +59 -48
- package/dist/mjs/data-structures/trie/trie.js +3 -3
- package/dist/mjs/interfaces/binary-tree.d.ts +5 -5
- package/dist/mjs/types/data-structures/binary-tree/binary-tree.d.ts +13 -13
- package/dist/mjs/types/data-structures/binary-tree/bst.d.ts +3 -3
- package/dist/umd/data-structure-typed.js +596 -468
- package/dist/umd/data-structure-typed.min.js +5 -5
- package/dist/umd/data-structure-typed.min.js.map +1 -1
- package/package.json +6 -6
- package/src/data-structures/binary-tree/avl-tree-multi-map.ts +60 -54
- package/src/data-structures/binary-tree/avl-tree.ts +32 -35
- package/src/data-structures/binary-tree/binary-tree.ts +440 -360
- package/src/data-structures/binary-tree/bst.ts +144 -113
- package/src/data-structures/binary-tree/rb-tree.ts +44 -43
- package/src/data-structures/binary-tree/tree-multi-map.ts +57 -61
- package/src/data-structures/trie/trie.ts +3 -3
- package/src/interfaces/binary-tree.ts +6 -6
- package/src/types/data-structures/binary-tree/binary-tree.ts +13 -14
- package/src/types/data-structures/binary-tree/bst.ts +3 -3
- package/test/performance/data-structures/binary-tree/binary-tree-overall.test.ts +2 -2
- package/test/performance/data-structures/binary-tree/rb-tree.test.ts +9 -1
- package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +115 -3
- package/test/unit/data-structures/binary-tree/avl-tree.test.ts +109 -4
- package/test/unit/data-structures/binary-tree/binary-tree.test.ts +183 -46
- package/test/unit/data-structures/binary-tree/bst.test.ts +340 -21
- package/test/unit/data-structures/binary-tree/rb-tree.test.ts +19 -0
- package/test/unit/data-structures/binary-tree/tree-multi-map.test.ts +141 -3
- package/test/utils/array.ts +15 -12
|
@@ -75,7 +75,7 @@ describe('AVLTreeMultiMap operations test1', () => {
|
|
|
75
75
|
const nodeId10 = treeMultimap.getNode(10);
|
|
76
76
|
expect(nodeId10?.key).toBe(10);
|
|
77
77
|
|
|
78
|
-
const nodeVal9 = treeMultimap.getNode(node => node.
|
|
78
|
+
const nodeVal9 = treeMultimap.getNode(node => node.key === 9);
|
|
79
79
|
expect(nodeVal9?.key).toBe(9);
|
|
80
80
|
|
|
81
81
|
const nodesByCount1 = treeMultimap.getNodes(node => node.count === 1);
|
|
@@ -331,7 +331,7 @@ describe('AVLTreeMultiMap operations test recursively1', () => {
|
|
|
331
331
|
const nodeId10 = treeMultimap.getNode(10);
|
|
332
332
|
expect(nodeId10?.key).toBe(10);
|
|
333
333
|
|
|
334
|
-
const nodeVal9 = treeMultimap.getNode(node => node.
|
|
334
|
+
const nodeVal9 = treeMultimap.getNode(node => node.key === 9);
|
|
335
335
|
expect(nodeVal9?.key).toBe(9);
|
|
336
336
|
|
|
337
337
|
const nodesByCount1 = treeMultimap.getNodes(node => node.count === 1);
|
|
@@ -678,7 +678,7 @@ describe('AVLTreeMultiMap iterative methods test', () => {
|
|
|
678
678
|
expect(treeMM.count).toBe(21);
|
|
679
679
|
const cloned = treeMM.clone();
|
|
680
680
|
expect(cloned.root?.left?.key).toBe(1);
|
|
681
|
-
expect(cloned.root?.right
|
|
681
|
+
expect(cloned.get(cloned.root?.right)).toBe('c');
|
|
682
682
|
});
|
|
683
683
|
|
|
684
684
|
it('should keys', () => {
|
|
@@ -761,3 +761,115 @@ describe('AVLTree toEntryFn', () => {
|
|
|
761
761
|
expect(tree.dfs(node => node.key, 'IN', tree.root, 'RECURSIVE')).toEqual(expected);
|
|
762
762
|
});
|
|
763
763
|
});
|
|
764
|
+
|
|
765
|
+
describe('AVLTreeMultiMap not map mode count', () => {
|
|
766
|
+
let tm: AVLTreeMultiMap<number>;
|
|
767
|
+
beforeEach(() => {
|
|
768
|
+
tm = new AVLTreeMultiMap<number>([], { isMapMode: false });
|
|
769
|
+
});
|
|
770
|
+
it('Should added isolated node count ', () => {
|
|
771
|
+
tm.addMany([
|
|
772
|
+
[1, 1],
|
|
773
|
+
[2, 2],
|
|
774
|
+
[3, 3],
|
|
775
|
+
[4, 4],
|
|
776
|
+
[5, 5]
|
|
777
|
+
]);
|
|
778
|
+
const newNode = new AVLTreeMultiMapNode(3, undefined, 10);
|
|
779
|
+
tm.add(newNode, 33);
|
|
780
|
+
expect(tm.count).toBe(15);
|
|
781
|
+
});
|
|
782
|
+
});
|
|
783
|
+
|
|
784
|
+
describe('AVLTreeMultiMap not map mode operations test1', () => {
|
|
785
|
+
it('should perform various operations on a Binary Search Tree with numeric values1', () => {
|
|
786
|
+
const treeMultimap = new AVLTreeMultiMap<number>([], { isMapMode: false });
|
|
787
|
+
|
|
788
|
+
expect(treeMultimap instanceof AVLTreeMultiMap);
|
|
789
|
+
treeMultimap.add([11, 11]);
|
|
790
|
+
treeMultimap.add([3, 3]);
|
|
791
|
+
const idAndValues: [number, number][] = [
|
|
792
|
+
[11, 11],
|
|
793
|
+
[3, 3],
|
|
794
|
+
[15, 15],
|
|
795
|
+
[1, 1],
|
|
796
|
+
[8, 8],
|
|
797
|
+
[13, 13],
|
|
798
|
+
[16, 16],
|
|
799
|
+
[2, 2],
|
|
800
|
+
[6, 6],
|
|
801
|
+
[9, 9],
|
|
802
|
+
[12, 12],
|
|
803
|
+
[14, 14],
|
|
804
|
+
[4, 4],
|
|
805
|
+
[7, 7],
|
|
806
|
+
[10, 10],
|
|
807
|
+
[5, 5]
|
|
808
|
+
];
|
|
809
|
+
treeMultimap.addMany(idAndValues);
|
|
810
|
+
expect(treeMultimap.root instanceof AVLTreeMultiMapNode);
|
|
811
|
+
|
|
812
|
+
if (treeMultimap.root) expect(treeMultimap.root.key == 11);
|
|
813
|
+
|
|
814
|
+
expect(treeMultimap.size).toBe(16);
|
|
815
|
+
expect(treeMultimap.count).toBe(18);
|
|
816
|
+
|
|
817
|
+
expect(treeMultimap.has(6));
|
|
818
|
+
|
|
819
|
+
expect(treeMultimap.getHeight(6)).toBe(4);
|
|
820
|
+
expect(treeMultimap.getDepth(6)).toBe(0);
|
|
821
|
+
const nodeId10 = treeMultimap.getNode(10);
|
|
822
|
+
expect(nodeId10?.key).toBe(10);
|
|
823
|
+
|
|
824
|
+
const nodeVal9 = treeMultimap.getNode(node => node.key === 9);
|
|
825
|
+
expect(nodeVal9?.key).toBe(9);
|
|
826
|
+
});
|
|
827
|
+
});
|
|
828
|
+
|
|
829
|
+
describe('AVLTreeMultiMap not map mode operations test recursively1', () => {
|
|
830
|
+
it('should perform various operations on a Binary Search Tree with numeric values1', () => {
|
|
831
|
+
const treeMultimap = new AVLTreeMultiMap<number>([], {
|
|
832
|
+
iterationType: 'RECURSIVE',
|
|
833
|
+
isMapMode: false
|
|
834
|
+
});
|
|
835
|
+
|
|
836
|
+
expect(treeMultimap instanceof AVLTreeMultiMap);
|
|
837
|
+
treeMultimap.add([11, 11]);
|
|
838
|
+
treeMultimap.add([3, 3]);
|
|
839
|
+
const idAndValues: [number, number][] = [
|
|
840
|
+
[11, 11],
|
|
841
|
+
[3, 3],
|
|
842
|
+
[15, 15],
|
|
843
|
+
[1, 1],
|
|
844
|
+
[8, 8],
|
|
845
|
+
[13, 13],
|
|
846
|
+
[16, 16],
|
|
847
|
+
[2, 2],
|
|
848
|
+
[6, 6],
|
|
849
|
+
[9, 9],
|
|
850
|
+
[12, 12],
|
|
851
|
+
[14, 14],
|
|
852
|
+
[4, 4],
|
|
853
|
+
[7, 7],
|
|
854
|
+
[10, 10],
|
|
855
|
+
[5, 5]
|
|
856
|
+
];
|
|
857
|
+
treeMultimap.addMany(idAndValues);
|
|
858
|
+
expect(treeMultimap.root).toBeInstanceOf(AVLTreeMultiMapNode);
|
|
859
|
+
|
|
860
|
+
if (treeMultimap.root) expect(treeMultimap.root.key).toBe(6);
|
|
861
|
+
|
|
862
|
+
expect(treeMultimap.size).toBe(16);
|
|
863
|
+
expect(treeMultimap.count).toBe(18);
|
|
864
|
+
|
|
865
|
+
expect(treeMultimap.has(6));
|
|
866
|
+
|
|
867
|
+
expect(treeMultimap.getHeight(6)).toBe(4);
|
|
868
|
+
expect(treeMultimap.getDepth(6)).toBe(0);
|
|
869
|
+
const nodeId10 = treeMultimap.getNode(10);
|
|
870
|
+
expect(nodeId10?.key).toBe(10);
|
|
871
|
+
|
|
872
|
+
const nodeVal9 = treeMultimap.getNode(node => node.key === 9);
|
|
873
|
+
expect(nodeVal9?.key).toBe(9);
|
|
874
|
+
});
|
|
875
|
+
});
|
|
@@ -32,8 +32,7 @@ describe('AVL Tree Test', () => {
|
|
|
32
32
|
expect(lesserSum).toBe(45);
|
|
33
33
|
|
|
34
34
|
// node15 has type problem. After the uniform design, the generics of containers (DirectedGraph, BST) are based on the type of value. However, this design has a drawback: when I attempt to inherit from the Vertex or BSTNode classes, the types of the results obtained by all methods are those of the parent class.
|
|
35
|
-
expect(node15?.value).toBe(
|
|
36
|
-
|
|
35
|
+
expect(node15?.value).toBe(undefined);
|
|
37
36
|
const dfs = tree.dfs(node => node, 'IN');
|
|
38
37
|
expect(dfs[0].key).toBe(1);
|
|
39
38
|
expect(dfs[dfs.length - 1].key).toBe(16);
|
|
@@ -107,6 +106,25 @@ describe('AVL Tree Test', () => {
|
|
|
107
106
|
expect(lastBFSNodes[1].key).toBe(2);
|
|
108
107
|
expect(lastBFSNodes[2].key).toBe(16);
|
|
109
108
|
});
|
|
109
|
+
|
|
110
|
+
it('should replace value', () => {
|
|
111
|
+
const tree = new AVLTree<number, string>([4, 5, [1, '1'], 2, 3], { isMapMode: false });
|
|
112
|
+
expect(tree.get(1)).toBe('1');
|
|
113
|
+
expect(tree.getNode(1)?.value).toBe('1');
|
|
114
|
+
tree.add(1, 'a');
|
|
115
|
+
expect(tree.get(1)).toBe('a');
|
|
116
|
+
tree.add([1, 'b']);
|
|
117
|
+
expect(tree.getNode(1)?.value).toBe('b');
|
|
118
|
+
expect(tree.get(1)).toBe('b');
|
|
119
|
+
const treeMap = new AVLTree<number>([4, 5, [1, '1'], 2, 3]);
|
|
120
|
+
expect(treeMap.get(1)).toBe('1');
|
|
121
|
+
expect(treeMap.getNode(1)?.value).toBe(undefined);
|
|
122
|
+
treeMap.add(1, 'a');
|
|
123
|
+
expect(treeMap.get(1)).toBe('a');
|
|
124
|
+
treeMap.add([1, 'b']);
|
|
125
|
+
expect(treeMap.getNode(1)?.value).toBe(undefined);
|
|
126
|
+
expect(treeMap.get(1)).toBe('b');
|
|
127
|
+
});
|
|
110
128
|
});
|
|
111
129
|
|
|
112
130
|
describe('AVL Tree Test recursively', () => {
|
|
@@ -140,7 +158,7 @@ describe('AVL Tree Test recursively', () => {
|
|
|
140
158
|
expect(lesserSum).toBe(45);
|
|
141
159
|
|
|
142
160
|
// node15 has type problem. After the uniform design, the generics of containers (DirectedGraph, BST) are based on the type of value. However, this design has a drawback: when I attempt to inherit from the Vertex or BSTNode classes, the types of the results obtained by all methods are those of the parent class.
|
|
143
|
-
expect(node15?.value).toBe(
|
|
161
|
+
expect(node15?.value).toBe(undefined);
|
|
144
162
|
|
|
145
163
|
const dfs = tree.dfs(node => node, 'IN');
|
|
146
164
|
expect(dfs[0].key).toBe(1);
|
|
@@ -419,7 +437,7 @@ describe('AVLTree iterative methods test', () => {
|
|
|
419
437
|
it('should clone work well', () => {
|
|
420
438
|
const cloned = avl.clone();
|
|
421
439
|
expect(cloned.root?.left?.key).toBe(1);
|
|
422
|
-
expect(cloned.root?.right?.value).toBe(
|
|
440
|
+
expect(cloned.root?.right?.value).toBe(undefined);
|
|
423
441
|
});
|
|
424
442
|
|
|
425
443
|
it('should keys', () => {
|
|
@@ -437,3 +455,90 @@ describe('AVLTree iterative methods test', () => {
|
|
|
437
455
|
expect(leaves).toEqual([1, 3]);
|
|
438
456
|
});
|
|
439
457
|
});
|
|
458
|
+
|
|
459
|
+
describe('AVL Tree not map mode', () => {
|
|
460
|
+
it('should perform various operations on a AVL Tree', () => {
|
|
461
|
+
const arr = [11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
|
|
462
|
+
const tree = new AVLTree<number>([], { isMapMode: false });
|
|
463
|
+
|
|
464
|
+
for (const i of arr) tree.add([i, i]);
|
|
465
|
+
|
|
466
|
+
tree.add(null);
|
|
467
|
+
const node6 = tree.getNode(6);
|
|
468
|
+
|
|
469
|
+
expect(node6 && tree.getHeight(node6)).toBe(3);
|
|
470
|
+
expect(node6 && tree.getDepth(node6)).toBe(1);
|
|
471
|
+
|
|
472
|
+
const getNodeById = tree.getNode(10);
|
|
473
|
+
expect(getNodeById?.key).toBe(10);
|
|
474
|
+
|
|
475
|
+
const getMinNodeByRoot = tree.getLeftMost();
|
|
476
|
+
expect(getMinNodeByRoot).toBe(1);
|
|
477
|
+
|
|
478
|
+
const node15 = tree.getNode(15);
|
|
479
|
+
const getMinNodeBySpecificNode = node15 && tree.getLeftMost(node => node, node15);
|
|
480
|
+
expect(getMinNodeBySpecificNode?.key).toBe(12);
|
|
481
|
+
|
|
482
|
+
let subTreeSum = 0;
|
|
483
|
+
if (node15) tree.dfs(node => (subTreeSum += node.key), 'PRE', node15);
|
|
484
|
+
expect(subTreeSum).toBe(70);
|
|
485
|
+
|
|
486
|
+
let lesserSum = 0;
|
|
487
|
+
tree.lesserOrGreaterTraverse(node => (lesserSum += node.key), -1, 10);
|
|
488
|
+
expect(lesserSum).toBe(45);
|
|
489
|
+
|
|
490
|
+
// node15 has type problem. After the uniform design, the generics of containers (DirectedGraph, BST) are based on the type of value. However, this design has a drawback: when I attempt to inherit from the Vertex or BSTNode classes, the types of the results obtained by all methods are those of the parent class.
|
|
491
|
+
expect(tree.get(node15)).toBe(15);
|
|
492
|
+
});
|
|
493
|
+
});
|
|
494
|
+
|
|
495
|
+
describe('AVL Tree not map mode test recursively', () => {
|
|
496
|
+
it('should perform various operations on a AVL Tree', () => {
|
|
497
|
+
const arr = [11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
|
|
498
|
+
const tree = new AVLTree<number>([], { iterationType: 'RECURSIVE', isMapMode: false });
|
|
499
|
+
|
|
500
|
+
for (const i of arr) tree.add([i, i]);
|
|
501
|
+
|
|
502
|
+
const node6 = tree.getNode(6);
|
|
503
|
+
|
|
504
|
+
expect(node6 && tree.getHeight(node6)).toBe(3);
|
|
505
|
+
expect(node6 && tree.getDepth(node6)).toBe(1);
|
|
506
|
+
|
|
507
|
+
const getNodeById = tree.getNode(10);
|
|
508
|
+
expect(getNodeById?.key).toBe(10);
|
|
509
|
+
|
|
510
|
+
const getMinNodeByRoot = tree.getLeftMost();
|
|
511
|
+
expect(getMinNodeByRoot).toBe(1);
|
|
512
|
+
|
|
513
|
+
const node15 = tree.getNode(15);
|
|
514
|
+
const getMinNodeBySpecificNode = node15 && tree.getLeftMost(node => node, node15);
|
|
515
|
+
expect(getMinNodeBySpecificNode?.key).toBe(12);
|
|
516
|
+
|
|
517
|
+
let subTreeSum = 0;
|
|
518
|
+
if (node15) tree.dfs(node => (subTreeSum += node.key), 'PRE', node15);
|
|
519
|
+
expect(subTreeSum).toBe(70);
|
|
520
|
+
|
|
521
|
+
let lesserSum = 0;
|
|
522
|
+
tree.lesserOrGreaterTraverse(node => (lesserSum += node.key), -1, 10);
|
|
523
|
+
expect(lesserSum).toBe(45);
|
|
524
|
+
|
|
525
|
+
// node15 has type problem. After the uniform design, the generics of containers (DirectedGraph, BST) are based on the type of value. However, this design has a drawback: when I attempt to inherit from the Vertex or BSTNode classes, the types of the results obtained by all methods are those of the parent class.
|
|
526
|
+
expect(tree.get(node15)).toBe(15);
|
|
527
|
+
});
|
|
528
|
+
});
|
|
529
|
+
|
|
530
|
+
describe('AVLTree iterative methods not map mode', () => {
|
|
531
|
+
let avl: AVLTree<number, string>;
|
|
532
|
+
beforeEach(() => {
|
|
533
|
+
avl = new AVLTree<number, string>([], { isMapMode: false });
|
|
534
|
+
avl.add([1, 'a']);
|
|
535
|
+
avl.add([2, 'b']);
|
|
536
|
+
avl.add([3, 'c']);
|
|
537
|
+
});
|
|
538
|
+
|
|
539
|
+
it('should clone work well', () => {
|
|
540
|
+
const cloned = avl.clone();
|
|
541
|
+
expect(cloned.root?.left?.key).toBe(1);
|
|
542
|
+
expect(cloned.get(cloned.root?.right?.key)).toBe('c');
|
|
543
|
+
});
|
|
544
|
+
});
|
|
@@ -20,6 +20,8 @@ describe('BinaryTreeNode', () => {
|
|
|
20
20
|
|
|
21
21
|
it('should set and get the value correctly', () => {
|
|
22
22
|
const node: BinaryTreeNode<number> = new BinaryTreeNode<number>(1, 42);
|
|
23
|
+
expect(node.key).toBe(1);
|
|
24
|
+
|
|
23
25
|
expect(node.value).toBe(42);
|
|
24
26
|
|
|
25
27
|
node.value = 55;
|
|
@@ -100,10 +102,10 @@ describe('BinaryTree addMany', () => {
|
|
|
100
102
|
],
|
|
101
103
|
[undefined, 22, 44, 33]
|
|
102
104
|
);
|
|
103
|
-
expect(tree.
|
|
104
|
-
expect(tree.getNodeByKey(3)
|
|
105
|
-
expect(tree.getNodeByKey(4)
|
|
106
|
-
expect(tree.getNodeByKey(1)
|
|
105
|
+
expect(tree.get(2)).toBe(22);
|
|
106
|
+
expect(tree.get(tree.getNodeByKey(3))).toBe(33);
|
|
107
|
+
expect(tree.get(tree.getNodeByKey(4))).toBe(44);
|
|
108
|
+
expect(tree.get(tree.getNodeByKey(1))).toBe(1);
|
|
107
109
|
});
|
|
108
110
|
|
|
109
111
|
it('should addMany undefined and null', () => {
|
|
@@ -191,7 +193,7 @@ describe('BinaryTree', () => {
|
|
|
191
193
|
const node4 = tree.getNode(4);
|
|
192
194
|
expect(tree.has(node4)).toBe(false);
|
|
193
195
|
expect(tree.has(node => node === node4)).toBe(false);
|
|
194
|
-
expect(tree.has(node => node.
|
|
196
|
+
expect(tree.has(node => node.key?.toString() === '3')).toBe(true);
|
|
195
197
|
});
|
|
196
198
|
|
|
197
199
|
it('should the clone method work fine', () => {
|
|
@@ -319,26 +321,28 @@ describe('BinaryTree', () => {
|
|
|
319
321
|
it('should isSubtreeBST', () => {
|
|
320
322
|
expect(tree.toVisual()).toBe('');
|
|
321
323
|
tree.addMany([4, 2, 6, 1, 3, 5, 7, 4]);
|
|
322
|
-
expect(tree.toVisual()).toBe(
|
|
323
|
-
'
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
324
|
+
expect(tree.toVisual()).toBe(
|
|
325
|
+
'N for null\n' +
|
|
326
|
+
' ___4___ \n' +
|
|
327
|
+
' / \\ \n' +
|
|
328
|
+
' _2_ _6_ \n' +
|
|
329
|
+
' / \\ / \\ \n' +
|
|
330
|
+
' 1 3 5 7 \n' +
|
|
331
|
+
' \n'
|
|
332
|
+
);
|
|
329
333
|
const visualized = tree.toVisual(undefined, { isShowUndefined: true, isShowNull: true, isShowRedBlackNIL: true });
|
|
330
334
|
expect(visualized).toBe(
|
|
331
335
|
'U for undefined\n' +
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
336
|
+
'N for null\n' +
|
|
337
|
+
'S for Sentinel Node(NIL)\n' +
|
|
338
|
+
' _______4_______ \n' +
|
|
339
|
+
' / \\ \n' +
|
|
340
|
+
' ___2___ ___6___ \n' +
|
|
341
|
+
' / \\ / \\ \n' +
|
|
342
|
+
' _1_ _3_ _5_ _7_ \n' +
|
|
343
|
+
' / \\ / \\ / \\ / \\ \n' +
|
|
344
|
+
' U U U U U U U U \n' +
|
|
345
|
+
' \n'
|
|
342
346
|
);
|
|
343
347
|
|
|
344
348
|
expect(tree.isBST(tree.getNode(4), 'RECURSIVE')).toBe(true);
|
|
@@ -729,34 +733,59 @@ describe('BinaryTree', () => {
|
|
|
729
733
|
]);
|
|
730
734
|
});
|
|
731
735
|
|
|
732
|
-
it('should
|
|
736
|
+
it('should keyValueNodeEntryRawToNodeAndValue', () => {
|
|
733
737
|
const tree = new BinaryTree<number>();
|
|
734
|
-
const node0 = tree.
|
|
735
|
-
expect(node0).toEqual(
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
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
|
+
]);
|
|
742
749
|
|
|
743
|
-
const nodeUndefined = tree.
|
|
744
|
-
expect(nodeUndefined).
|
|
750
|
+
const nodeUndefined = tree.keyValueNodeEntryRawToNodeAndValue(undefined);
|
|
751
|
+
expect(nodeUndefined).toEqual([undefined, undefined]);
|
|
745
752
|
|
|
746
|
-
const nodeNull = tree.
|
|
747
|
-
expect(nodeNull).
|
|
753
|
+
const nodeNull = tree.keyValueNodeEntryRawToNodeAndValue(null);
|
|
754
|
+
expect(nodeNull).toEqual([null, undefined]);
|
|
748
755
|
|
|
749
|
-
const nodeWithSeparateValue = tree.
|
|
750
|
-
expect(nodeWithSeparateValue
|
|
756
|
+
const [, nodeWithSeparateValue] = tree.keyValueNodeEntryRawToNodeAndValue(7, 77);
|
|
757
|
+
expect(nodeWithSeparateValue).toBe(77);
|
|
751
758
|
|
|
752
|
-
expect(tree.
|
|
759
|
+
expect(tree.keyValueNodeEntryRawToNodeAndValue([undefined, 2])).toEqual([undefined, undefined]);
|
|
753
760
|
|
|
754
|
-
expect(tree.
|
|
761
|
+
expect(tree.keyValueNodeEntryRawToNodeAndValue(Symbol('test') as unknown as number)).toEqual([
|
|
762
|
+
undefined,
|
|
763
|
+
undefined
|
|
764
|
+
]);
|
|
755
765
|
|
|
756
766
|
const bTree = new BinaryTree<number, number, { obj: { id: number } }>([], {
|
|
757
767
|
toEntryFn: (ele: { obj: { id: number } }) => [Symbol('test') as unknown as number, ele.obj.id]
|
|
758
768
|
});
|
|
759
|
-
expect(bTree.
|
|
769
|
+
expect(bTree.keyValueNodeEntryRawToNodeAndValue({ obj: { id: 1 } })).toEqual([undefined, undefined]);
|
|
770
|
+
});
|
|
771
|
+
|
|
772
|
+
it('should replace value', () => {
|
|
773
|
+
const tree = new BinaryTree<number, string>([4, 5, [1, '1'], 2, 3], { isMapMode: false });
|
|
774
|
+
expect(tree.get(1)).toBe('1');
|
|
775
|
+
expect(tree.getNode(1)?.value).toBe('1');
|
|
776
|
+
tree.add(1, 'a');
|
|
777
|
+
expect(tree.get(1)).toBe('a');
|
|
778
|
+
tree.add([1, 'b']);
|
|
779
|
+
expect(tree.getNode(1)?.value).toBe('b');
|
|
780
|
+
expect(tree.get(1)).toBe('b');
|
|
781
|
+
const treeMap = new BinaryTree<number>([4, 5, [1, '1'], 2, 3]);
|
|
782
|
+
expect(treeMap.get(1)).toBe('1');
|
|
783
|
+
expect(treeMap.getNode(1)?.value).toBe(undefined);
|
|
784
|
+
treeMap.add(1, 'a');
|
|
785
|
+
expect(treeMap.get(1)).toBe('a');
|
|
786
|
+
treeMap.add([1, 'b']);
|
|
787
|
+
expect(treeMap.getNode(1)?.value).toBe(undefined);
|
|
788
|
+
expect(treeMap.get(1)).toBe('b');
|
|
760
789
|
});
|
|
761
790
|
});
|
|
762
791
|
|
|
@@ -1039,9 +1068,9 @@ describe('BinaryTree', () => {
|
|
|
1039
1068
|
const nodeB = tree.getNode(3);
|
|
1040
1069
|
|
|
1041
1070
|
expect(nodeA?.key).toBe(5);
|
|
1042
|
-
expect(nodeA?.value).toBe(
|
|
1071
|
+
expect(nodeA?.value).toBe(undefined);
|
|
1043
1072
|
expect(nodeB?.key).toBe(3);
|
|
1044
|
-
expect(nodeB
|
|
1073
|
+
expect(tree.get(nodeB)).toBe('B');
|
|
1045
1074
|
});
|
|
1046
1075
|
|
|
1047
1076
|
it('should return null when getting a non-existent node', () => {
|
|
@@ -1150,17 +1179,17 @@ describe('BinaryTree', () => {
|
|
|
1150
1179
|
tree.add([2, 'B']);
|
|
1151
1180
|
tree.add([null, 'null']);
|
|
1152
1181
|
|
|
1153
|
-
const nodes = tree.getNodes(node => node.
|
|
1182
|
+
const nodes = tree.getNodes(node => node.key === 2);
|
|
1154
1183
|
|
|
1155
1184
|
expect(nodes.length).toBe(1);
|
|
1156
1185
|
expect(nodes[0].key).toBe(2);
|
|
1157
1186
|
|
|
1158
|
-
const nodesRec = tree.getNodes(node => node.
|
|
1187
|
+
const nodesRec = tree.getNodes(node => node.key === 2, false, tree.root, 'RECURSIVE');
|
|
1159
1188
|
|
|
1160
1189
|
expect(nodesRec.length).toBe(1);
|
|
1161
1190
|
expect(nodesRec[0].key).toBe(2);
|
|
1162
1191
|
|
|
1163
|
-
const nodesItr = tree.getNodes(node => node.
|
|
1192
|
+
const nodesItr = tree.getNodes(node => node.key === 2, false, tree.root, 'ITERATIVE');
|
|
1164
1193
|
|
|
1165
1194
|
expect(nodesItr.length).toBe(1);
|
|
1166
1195
|
expect(nodesItr[0].key).toBe(2);
|
|
@@ -1206,6 +1235,97 @@ describe('BinaryTree', () => {
|
|
|
1206
1235
|
});
|
|
1207
1236
|
});
|
|
1208
1237
|
|
|
1238
|
+
describe('BinaryTree not map mode', () => {
|
|
1239
|
+
let tree: BinaryTree<number, string>;
|
|
1240
|
+
|
|
1241
|
+
beforeEach(() => {
|
|
1242
|
+
tree = new BinaryTree<number, string>([], {
|
|
1243
|
+
iterationType: 'RECURSIVE',
|
|
1244
|
+
isMapMode: false
|
|
1245
|
+
});
|
|
1246
|
+
});
|
|
1247
|
+
|
|
1248
|
+
afterEach(() => {
|
|
1249
|
+
tree.clear();
|
|
1250
|
+
});
|
|
1251
|
+
|
|
1252
|
+
it('should add and find nodes', () => {
|
|
1253
|
+
tree.add([1, 1]);
|
|
1254
|
+
tree.add(undefined);
|
|
1255
|
+
tree.add([2, 2]);
|
|
1256
|
+
tree.add([3, 3]);
|
|
1257
|
+
|
|
1258
|
+
expect(tree.has(1)).toBe(true);
|
|
1259
|
+
expect(tree.has(2)).toBe(true);
|
|
1260
|
+
expect(tree.has(3)).toBe(true);
|
|
1261
|
+
expect(tree.has(4)).toBe(false);
|
|
1262
|
+
const node4 = tree.getNode(4);
|
|
1263
|
+
expect(tree.has(node4)).toBe(false);
|
|
1264
|
+
expect(tree.has(node => node === node4)).toBe(false);
|
|
1265
|
+
expect(tree.has(node => node.value?.toString() === '3')).toBe(true);
|
|
1266
|
+
});
|
|
1267
|
+
|
|
1268
|
+
it('should isSubtreeBST', () => {
|
|
1269
|
+
tree.addMany([
|
|
1270
|
+
new BinaryTreeNode(4),
|
|
1271
|
+
new BinaryTreeNode(2),
|
|
1272
|
+
new BinaryTreeNode(6),
|
|
1273
|
+
new BinaryTreeNode(1),
|
|
1274
|
+
new BinaryTreeNode(3),
|
|
1275
|
+
new BinaryTreeNode(5),
|
|
1276
|
+
new BinaryTreeNode(7),
|
|
1277
|
+
new BinaryTreeNode(4)
|
|
1278
|
+
]);
|
|
1279
|
+
|
|
1280
|
+
expect(tree.isBST(tree.getNode(4), 'RECURSIVE')).toBe(true);
|
|
1281
|
+
expect(tree.isBST(tree.getNode(4), 'ITERATIVE')).toBe(true);
|
|
1282
|
+
});
|
|
1283
|
+
|
|
1284
|
+
it('should get nodes by key', () => {
|
|
1285
|
+
tree.add([5, 'A']);
|
|
1286
|
+
tree.add([3, 'B']);
|
|
1287
|
+
tree.add([7, 'C']);
|
|
1288
|
+
|
|
1289
|
+
const nodeA = tree.getNode(5);
|
|
1290
|
+
const nodeB = tree.getNode(3);
|
|
1291
|
+
|
|
1292
|
+
expect(nodeA?.key).toBe(5);
|
|
1293
|
+
expect(tree.get(nodeA)).toBe('A');
|
|
1294
|
+
expect(nodeB?.key).toBe(3);
|
|
1295
|
+
expect(tree.get(nodeB)).toBe('B');
|
|
1296
|
+
});
|
|
1297
|
+
|
|
1298
|
+
it('should get nodes by a custom callback', () => {
|
|
1299
|
+
tree.add([5, 'E']);
|
|
1300
|
+
tree.add([4, 'D']);
|
|
1301
|
+
tree.add([3, 'C']);
|
|
1302
|
+
tree.add([7, 'G']);
|
|
1303
|
+
tree.add([null, 'null']);
|
|
1304
|
+
tree.add([1, 'A']);
|
|
1305
|
+
tree.add([6, 'F']);
|
|
1306
|
+
tree.add([null, 'null']);
|
|
1307
|
+
tree.add([2, 'B']);
|
|
1308
|
+
tree.add([null, 'null']);
|
|
1309
|
+
|
|
1310
|
+
const nodes = tree.getNodes(node => node.key === 2);
|
|
1311
|
+
|
|
1312
|
+
expect(nodes.length).toBe(1);
|
|
1313
|
+
expect(nodes[0].key).toBe(2);
|
|
1314
|
+
|
|
1315
|
+
const nodesRec = tree.getNodes(node => node.key === 2, false, tree.root, 'RECURSIVE');
|
|
1316
|
+
|
|
1317
|
+
expect(nodesRec.length).toBe(1);
|
|
1318
|
+
expect(nodesRec[0].key).toBe(2);
|
|
1319
|
+
|
|
1320
|
+
const nodesItr = tree.getNodes(node => node.key === 2, false, tree.root, 'ITERATIVE');
|
|
1321
|
+
|
|
1322
|
+
expect(nodesItr.length).toBe(1);
|
|
1323
|
+
expect(nodesItr[0].key).toBe(2);
|
|
1324
|
+
|
|
1325
|
+
expect(nodesItr).toEqual(nodesRec);
|
|
1326
|
+
});
|
|
1327
|
+
});
|
|
1328
|
+
|
|
1209
1329
|
describe('BinaryTree iterative methods test', () => {
|
|
1210
1330
|
let binaryTree: BinaryTree<number, string>;
|
|
1211
1331
|
beforeEach(() => {
|
|
@@ -1273,7 +1393,8 @@ describe('BinaryTree iterative methods test', () => {
|
|
|
1273
1393
|
it('should clone work well', () => {
|
|
1274
1394
|
const cloned = binaryTree.clone();
|
|
1275
1395
|
expect(cloned.root?.left?.key).toBe(2);
|
|
1276
|
-
expect(cloned.root?.right?.value).toBe(
|
|
1396
|
+
expect(cloned.root?.right?.value).toBe(undefined);
|
|
1397
|
+
expect(cloned.get(cloned.root?.right)).toBe('c');
|
|
1277
1398
|
});
|
|
1278
1399
|
|
|
1279
1400
|
it('should keys', () => {
|
|
@@ -1315,3 +1436,19 @@ describe('BinaryTree iterative methods test', () => {
|
|
|
1315
1436
|
]);
|
|
1316
1437
|
});
|
|
1317
1438
|
});
|
|
1439
|
+
|
|
1440
|
+
describe('BinaryTree not map mode iterative methods test', () => {
|
|
1441
|
+
let binaryTree: BinaryTree<number, string>;
|
|
1442
|
+
beforeEach(() => {
|
|
1443
|
+
binaryTree = new BinaryTree<number, string>([], { isMapMode: false });
|
|
1444
|
+
binaryTree.add([1, 'a']);
|
|
1445
|
+
binaryTree.add(2, 'b');
|
|
1446
|
+
binaryTree.add([3, 'c']);
|
|
1447
|
+
});
|
|
1448
|
+
|
|
1449
|
+
it('should clone work well', () => {
|
|
1450
|
+
const cloned = binaryTree.clone();
|
|
1451
|
+
expect(cloned.root?.left?.key).toBe(2);
|
|
1452
|
+
expect(cloned.get(cloned.root?.right)).toBe('c');
|
|
1453
|
+
});
|
|
1454
|
+
});
|