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.
Files changed (65) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +13 -13
  3. package/benchmark/report.html +1 -37
  4. package/benchmark/report.json +24 -384
  5. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +21 -21
  6. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js +64 -47
  7. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -1
  8. package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +20 -20
  9. package/dist/cjs/data-structures/binary-tree/avl-tree.js +29 -27
  10. package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
  11. package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +186 -144
  12. package/dist/cjs/data-structures/binary-tree/binary-tree.js +376 -265
  13. package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
  14. package/dist/cjs/data-structures/binary-tree/bst.d.ts +56 -56
  15. package/dist/cjs/data-structures/binary-tree/bst.js +108 -78
  16. package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
  17. package/dist/cjs/data-structures/binary-tree/rb-tree.d.ts +13 -13
  18. package/dist/cjs/data-structures/binary-tree/rb-tree.js +42 -36
  19. package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
  20. package/dist/cjs/data-structures/binary-tree/tree-multi-map.d.ts +21 -21
  21. package/dist/cjs/data-structures/binary-tree/tree-multi-map.js +59 -49
  22. package/dist/cjs/data-structures/binary-tree/tree-multi-map.js.map +1 -1
  23. package/dist/cjs/data-structures/trie/trie.js +3 -3
  24. package/dist/cjs/interfaces/binary-tree.d.ts +5 -5
  25. package/dist/cjs/types/data-structures/binary-tree/binary-tree.d.ts +13 -13
  26. package/dist/cjs/types/data-structures/binary-tree/bst.d.ts +3 -3
  27. package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +21 -21
  28. package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.js +64 -46
  29. package/dist/mjs/data-structures/binary-tree/avl-tree.d.ts +20 -20
  30. package/dist/mjs/data-structures/binary-tree/avl-tree.js +29 -26
  31. package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +186 -144
  32. package/dist/mjs/data-structures/binary-tree/binary-tree.js +376 -264
  33. package/dist/mjs/data-structures/binary-tree/bst.d.ts +56 -56
  34. package/dist/mjs/data-structures/binary-tree/bst.js +108 -76
  35. package/dist/mjs/data-structures/binary-tree/rb-tree.d.ts +13 -13
  36. package/dist/mjs/data-structures/binary-tree/rb-tree.js +42 -35
  37. package/dist/mjs/data-structures/binary-tree/tree-multi-map.d.ts +21 -21
  38. package/dist/mjs/data-structures/binary-tree/tree-multi-map.js +59 -48
  39. package/dist/mjs/data-structures/trie/trie.js +3 -3
  40. package/dist/mjs/interfaces/binary-tree.d.ts +5 -5
  41. package/dist/mjs/types/data-structures/binary-tree/binary-tree.d.ts +13 -13
  42. package/dist/mjs/types/data-structures/binary-tree/bst.d.ts +3 -3
  43. package/dist/umd/data-structure-typed.js +596 -468
  44. package/dist/umd/data-structure-typed.min.js +5 -5
  45. package/dist/umd/data-structure-typed.min.js.map +1 -1
  46. package/package.json +6 -6
  47. package/src/data-structures/binary-tree/avl-tree-multi-map.ts +60 -54
  48. package/src/data-structures/binary-tree/avl-tree.ts +32 -35
  49. package/src/data-structures/binary-tree/binary-tree.ts +440 -360
  50. package/src/data-structures/binary-tree/bst.ts +144 -113
  51. package/src/data-structures/binary-tree/rb-tree.ts +44 -43
  52. package/src/data-structures/binary-tree/tree-multi-map.ts +57 -61
  53. package/src/data-structures/trie/trie.ts +3 -3
  54. package/src/interfaces/binary-tree.ts +6 -6
  55. package/src/types/data-structures/binary-tree/binary-tree.ts +13 -14
  56. package/src/types/data-structures/binary-tree/bst.ts +3 -3
  57. package/test/performance/data-structures/binary-tree/binary-tree-overall.test.ts +2 -2
  58. package/test/performance/data-structures/binary-tree/rb-tree.test.ts +9 -1
  59. package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +115 -3
  60. package/test/unit/data-structures/binary-tree/avl-tree.test.ts +109 -4
  61. package/test/unit/data-structures/binary-tree/binary-tree.test.ts +183 -46
  62. package/test/unit/data-structures/binary-tree/bst.test.ts +340 -21
  63. package/test/unit/data-structures/binary-tree/rb-tree.test.ts +19 -0
  64. package/test/unit/data-structures/binary-tree/tree-multi-map.test.ts +141 -3
  65. 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.value === 9);
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.value === 9);
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?.value).toBe('c');
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(15);
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(15);
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('c');
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.getNodeByKey(2)?.value).toBe(22);
104
- expect(tree.getNodeByKey(3)?.value).toBe(33);
105
- expect(tree.getNodeByKey(4)?.value).toBe(44);
106
- expect(tree.getNodeByKey(1)?.value).toBe(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.value?.toString() === '3')).toBe(true);
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('N for null\n' +
323
- ' ___4___ \n' +
324
- ' / \\ \n' +
325
- ' _2_ _6_ \n' +
326
- ' / \\ / \\ \n' +
327
- ' 1 3 5 7 \n' +
328
- ' \n');
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
- 'N for null\n' +
333
- 'S for Sentinel Node(NIL)\n' +
334
- ' _______4_______ \n' +
335
- ' / \\ \n' +
336
- ' ___2___ ___6___ \n' +
337
- ' / \\ / \\ \n' +
338
- ' _1_ _3_ _5_ _7_ \n' +
339
- ' / \\ / \\ / \\ / \\ \n' +
340
- ' U U U U U U U U \n' +
341
- ' \n'
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 keyValueOrEntryOrRawElementToNode', () => {
736
+ it('should keyValueNodeEntryRawToNodeAndValue', () => {
733
737
  const tree = new BinaryTree<number>();
734
- const node0 = tree.keyValueOrEntryOrRawElementToNode(0);
735
- expect(node0).toEqual({
736
- _left: undefined,
737
- _right: undefined,
738
- key: 0,
739
- parent: undefined,
740
- value: undefined
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.keyValueOrEntryOrRawElementToNode(undefined);
744
- expect(nodeUndefined).toBe(undefined);
750
+ const nodeUndefined = tree.keyValueNodeEntryRawToNodeAndValue(undefined);
751
+ expect(nodeUndefined).toEqual([undefined, undefined]);
745
752
 
746
- const nodeNull = tree.keyValueOrEntryOrRawElementToNode(null);
747
- expect(nodeNull).toBe(null);
753
+ const nodeNull = tree.keyValueNodeEntryRawToNodeAndValue(null);
754
+ expect(nodeNull).toEqual([null, undefined]);
748
755
 
749
- const nodeWithSeparateValue = tree.keyValueOrEntryOrRawElementToNode(7, 77);
750
- expect(nodeWithSeparateValue?.value).toBe(77);
756
+ const [, nodeWithSeparateValue] = tree.keyValueNodeEntryRawToNodeAndValue(7, 77);
757
+ expect(nodeWithSeparateValue).toBe(77);
751
758
 
752
- expect(tree.keyValueOrEntryOrRawElementToNode([undefined, 2])).toBe(undefined);
759
+ expect(tree.keyValueNodeEntryRawToNodeAndValue([undefined, 2])).toEqual([undefined, undefined]);
753
760
 
754
- expect(tree.keyValueOrEntryOrRawElementToNode(Symbol('test') as unknown as number)).toBe(undefined);
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.keyValueOrEntryOrRawElementToNode({ obj: { id: 1 } })).toBe(undefined);
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('A');
1071
+ expect(nodeA?.value).toBe(undefined);
1043
1072
  expect(nodeB?.key).toBe(3);
1044
- expect(nodeB?.value).toBe('B');
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.value === 'B');
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.value === 'B', false, tree.root, 'RECURSIVE');
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.value === 'B', false, tree.root, 'ITERATIVE');
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('c');
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
+ });