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.
Files changed (164) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/CONTRIBUTING.md +1 -1
  3. package/dist/cjs/common/index.js +5 -0
  4. package/dist/cjs/common/index.js.map +1 -1
  5. package/dist/cjs/data-structures/base/iterable-entry-base.js +4 -4
  6. package/dist/cjs/data-structures/base/iterable-entry-base.js.map +1 -1
  7. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +36 -17
  8. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js +65 -36
  9. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -1
  10. package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +12 -8
  11. package/dist/cjs/data-structures/binary-tree/avl-tree.js +19 -6
  12. package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
  13. package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +53 -40
  14. package/dist/cjs/data-structures/binary-tree/binary-tree.js +76 -72
  15. package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
  16. package/dist/cjs/data-structures/binary-tree/bst.d.ts +87 -52
  17. package/dist/cjs/data-structures/binary-tree/bst.js +111 -63
  18. package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
  19. package/dist/cjs/data-structures/binary-tree/index.d.ts +1 -1
  20. package/dist/cjs/data-structures/binary-tree/index.js +1 -1
  21. package/dist/cjs/data-structures/binary-tree/index.js.map +1 -1
  22. package/dist/cjs/data-structures/binary-tree/{rb-tree.d.ts → red-black-tree.d.ts} +83 -10
  23. package/dist/cjs/data-structures/binary-tree/{rb-tree.js → red-black-tree.js} +92 -45
  24. package/dist/cjs/data-structures/binary-tree/red-black-tree.js.map +1 -0
  25. package/dist/cjs/data-structures/binary-tree/tree-multi-map.d.ts +34 -18
  26. package/dist/cjs/data-structures/binary-tree/tree-multi-map.js +66 -40
  27. package/dist/cjs/data-structures/binary-tree/tree-multi-map.js.map +1 -1
  28. package/dist/cjs/data-structures/graph/abstract-graph.js +2 -2
  29. package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
  30. package/dist/cjs/data-structures/hash/hash-map.d.ts +31 -1
  31. package/dist/cjs/data-structures/hash/hash-map.js +35 -5
  32. package/dist/cjs/data-structures/hash/hash-map.js.map +1 -1
  33. package/dist/cjs/data-structures/heap/heap.d.ts +20 -3
  34. package/dist/cjs/data-structures/heap/heap.js +31 -11
  35. package/dist/cjs/data-structures/heap/heap.js.map +1 -1
  36. package/dist/cjs/data-structures/linked-list/doubly-linked-list.d.ts +46 -11
  37. package/dist/cjs/data-structures/linked-list/doubly-linked-list.js +68 -21
  38. package/dist/cjs/data-structures/linked-list/doubly-linked-list.js.map +1 -1
  39. package/dist/cjs/data-structures/linked-list/singly-linked-list.d.ts +44 -11
  40. package/dist/cjs/data-structures/linked-list/singly-linked-list.js +70 -26
  41. package/dist/cjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
  42. package/dist/cjs/data-structures/queue/deque.d.ts +37 -8
  43. package/dist/cjs/data-structures/queue/deque.js +73 -29
  44. package/dist/cjs/data-structures/queue/deque.js.map +1 -1
  45. package/dist/cjs/data-structures/queue/queue.d.ts +41 -1
  46. package/dist/cjs/data-structures/queue/queue.js +51 -9
  47. package/dist/cjs/data-structures/queue/queue.js.map +1 -1
  48. package/dist/cjs/data-structures/stack/stack.d.ts +27 -10
  49. package/dist/cjs/data-structures/stack/stack.js +39 -20
  50. package/dist/cjs/data-structures/stack/stack.js.map +1 -1
  51. package/dist/cjs/data-structures/trie/trie.d.ts +12 -13
  52. package/dist/cjs/data-structures/trie/trie.js +12 -13
  53. package/dist/cjs/data-structures/trie/trie.js.map +1 -1
  54. package/dist/cjs/interfaces/binary-tree.d.ts +3 -4
  55. package/dist/cjs/types/data-structures/base/base.d.ts +1 -1
  56. package/dist/cjs/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +2 -3
  57. package/dist/cjs/types/data-structures/binary-tree/avl-tree.d.ts +2 -3
  58. package/dist/cjs/types/data-structures/binary-tree/binary-tree.d.ts +2 -3
  59. package/dist/cjs/types/data-structures/binary-tree/bst.d.ts +3 -4
  60. package/dist/cjs/types/data-structures/binary-tree/rb-tree.d.ts +4 -5
  61. package/dist/cjs/types/data-structures/binary-tree/tree-multi-map.d.ts +4 -5
  62. package/dist/mjs/common/index.js +5 -0
  63. package/dist/mjs/common/index.js.map +1 -1
  64. package/dist/mjs/data-structures/base/iterable-entry-base.js +4 -4
  65. package/dist/mjs/data-structures/base/iterable-entry-base.js.map +1 -1
  66. package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +36 -17
  67. package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.js +65 -36
  68. package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -1
  69. package/dist/mjs/data-structures/binary-tree/avl-tree.d.ts +12 -8
  70. package/dist/mjs/data-structures/binary-tree/avl-tree.js +19 -6
  71. package/dist/mjs/data-structures/binary-tree/avl-tree.js.map +1 -1
  72. package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +53 -40
  73. package/dist/mjs/data-structures/binary-tree/binary-tree.js +76 -72
  74. package/dist/mjs/data-structures/binary-tree/binary-tree.js.map +1 -1
  75. package/dist/mjs/data-structures/binary-tree/bst.d.ts +87 -52
  76. package/dist/mjs/data-structures/binary-tree/bst.js +127 -79
  77. package/dist/mjs/data-structures/binary-tree/bst.js.map +1 -1
  78. package/dist/mjs/data-structures/binary-tree/index.d.ts +1 -1
  79. package/dist/mjs/data-structures/binary-tree/index.js +1 -1
  80. package/dist/mjs/data-structures/binary-tree/index.js.map +1 -1
  81. package/dist/mjs/data-structures/binary-tree/{rb-tree.d.ts → red-black-tree.d.ts} +83 -10
  82. package/dist/mjs/data-structures/binary-tree/{rb-tree.js → red-black-tree.js} +92 -45
  83. package/dist/mjs/data-structures/binary-tree/red-black-tree.js.map +1 -0
  84. package/dist/mjs/data-structures/binary-tree/tree-multi-map.d.ts +34 -18
  85. package/dist/mjs/data-structures/binary-tree/tree-multi-map.js +64 -38
  86. package/dist/mjs/data-structures/binary-tree/tree-multi-map.js.map +1 -1
  87. package/dist/mjs/data-structures/graph/abstract-graph.js +2 -2
  88. package/dist/mjs/data-structures/graph/abstract-graph.js.map +1 -1
  89. package/dist/mjs/data-structures/hash/hash-map.d.ts +31 -1
  90. package/dist/mjs/data-structures/hash/hash-map.js +35 -5
  91. package/dist/mjs/data-structures/hash/hash-map.js.map +1 -1
  92. package/dist/mjs/data-structures/heap/heap.d.ts +20 -3
  93. package/dist/mjs/data-structures/heap/heap.js +31 -11
  94. package/dist/mjs/data-structures/heap/heap.js.map +1 -1
  95. package/dist/mjs/data-structures/linked-list/doubly-linked-list.d.ts +46 -11
  96. package/dist/mjs/data-structures/linked-list/doubly-linked-list.js +68 -21
  97. package/dist/mjs/data-structures/linked-list/doubly-linked-list.js.map +1 -1
  98. package/dist/mjs/data-structures/linked-list/singly-linked-list.d.ts +44 -11
  99. package/dist/mjs/data-structures/linked-list/singly-linked-list.js +70 -26
  100. package/dist/mjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
  101. package/dist/mjs/data-structures/queue/deque.d.ts +37 -8
  102. package/dist/mjs/data-structures/queue/deque.js +73 -29
  103. package/dist/mjs/data-structures/queue/deque.js.map +1 -1
  104. package/dist/mjs/data-structures/queue/queue.d.ts +41 -1
  105. package/dist/mjs/data-structures/queue/queue.js +51 -9
  106. package/dist/mjs/data-structures/queue/queue.js.map +1 -1
  107. package/dist/mjs/data-structures/stack/stack.d.ts +27 -10
  108. package/dist/mjs/data-structures/stack/stack.js +39 -20
  109. package/dist/mjs/data-structures/stack/stack.js.map +1 -1
  110. package/dist/mjs/data-structures/trie/trie.d.ts +12 -13
  111. package/dist/mjs/data-structures/trie/trie.js +12 -13
  112. package/dist/mjs/data-structures/trie/trie.js.map +1 -1
  113. package/dist/mjs/interfaces/binary-tree.d.ts +3 -4
  114. package/dist/mjs/types/data-structures/base/base.d.ts +1 -1
  115. package/dist/mjs/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +2 -3
  116. package/dist/mjs/types/data-structures/binary-tree/avl-tree.d.ts +2 -3
  117. package/dist/mjs/types/data-structures/binary-tree/binary-tree.d.ts +2 -3
  118. package/dist/mjs/types/data-structures/binary-tree/bst.d.ts +3 -4
  119. package/dist/mjs/types/data-structures/binary-tree/rb-tree.d.ts +4 -5
  120. package/dist/mjs/types/data-structures/binary-tree/tree-multi-map.d.ts +4 -5
  121. package/dist/umd/data-structure-typed.js +722 -356
  122. package/dist/umd/data-structure-typed.min.js +3 -3
  123. package/dist/umd/data-structure-typed.min.js.map +1 -1
  124. package/package.json +6 -6
  125. package/src/common/index.ts +7 -1
  126. package/src/data-structures/base/iterable-entry-base.ts +4 -4
  127. package/src/data-structures/binary-tree/avl-tree-multi-map.ts +82 -55
  128. package/src/data-structures/binary-tree/avl-tree.ts +32 -15
  129. package/src/data-structures/binary-tree/binary-tree.ts +89 -84
  130. package/src/data-structures/binary-tree/bst.ts +149 -97
  131. package/src/data-structures/binary-tree/index.ts +1 -1
  132. package/src/data-structures/binary-tree/{rb-tree.ts → red-black-tree.ts} +105 -55
  133. package/src/data-structures/binary-tree/tree-multi-map.ts +81 -51
  134. package/src/data-structures/graph/abstract-graph.ts +2 -2
  135. package/src/data-structures/hash/hash-map.ts +37 -7
  136. package/src/data-structures/heap/heap.ts +33 -10
  137. package/src/data-structures/linked-list/doubly-linked-list.ts +75 -21
  138. package/src/data-structures/linked-list/singly-linked-list.ts +77 -27
  139. package/src/data-structures/queue/deque.ts +72 -28
  140. package/src/data-structures/queue/queue.ts +50 -7
  141. package/src/data-structures/stack/stack.ts +39 -20
  142. package/src/data-structures/trie/trie.ts +8 -3
  143. package/src/interfaces/binary-tree.ts +3 -13
  144. package/src/types/data-structures/base/base.ts +1 -1
  145. package/src/types/data-structures/binary-tree/avl-tree-multi-map.ts +2 -4
  146. package/src/types/data-structures/binary-tree/avl-tree.ts +2 -4
  147. package/src/types/data-structures/binary-tree/binary-tree.ts +3 -3
  148. package/src/types/data-structures/binary-tree/bst.ts +3 -5
  149. package/src/types/data-structures/binary-tree/rb-tree.ts +4 -6
  150. package/src/types/data-structures/binary-tree/tree-multi-map.ts +4 -6
  151. package/test/integration/index.html +3 -3
  152. package/test/performance/data-structures/binary-tree/binary-tree-overall.test.ts +3 -3
  153. package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +12 -12
  154. package/test/unit/data-structures/binary-tree/avl-tree.test.ts +10 -10
  155. package/test/unit/data-structures/binary-tree/binary-tree.test.ts +45 -45
  156. package/test/unit/data-structures/binary-tree/bst.test.ts +90 -96
  157. package/test/unit/data-structures/binary-tree/data/cost-of-living-by-country.ts +259 -0
  158. package/test/unit/data-structures/binary-tree/overall.test.ts +2 -0
  159. package/test/unit/data-structures/binary-tree/{rb-tree.test.ts → red-black-tree.test.ts} +67 -92
  160. package/test/unit/data-structures/binary-tree/tree-multi-map.test.ts +10 -10
  161. package/test/unit/data-structures/graph/directed-graph.test.ts +4 -4
  162. package/test/unit/data-structures/hash/hash-map.test.ts +12 -12
  163. package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +0 -1
  164. package/dist/mjs/data-structures/binary-tree/rb-tree.js.map +0 -1
@@ -1,8 +1,6 @@
1
- import { TreeMultiMap, TreeMultiMapNode } from '../../../data-structures';
2
- import type { RBTreeOptions } from './rb-tree';
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, 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, 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, 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, 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>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
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 TreeMultiMapNested<K, V, R, NODE extends TreeMultiMapNode<K, V, NODE>> = TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
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 cRBTree = new OrderedMap();
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
- cRBTree.setElement(i, i);
120
+ cRedBlackTree.setElement(i, i);
121
121
  }
122
122
  console.log((performance.now() - cS).toFixed(2), `CRedBlackTree ${n.toLocaleString()} add`);
123
- console.log(cRBTree.size(), `cRBTree.size()`);
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()} RBTree add randomly`, () => {
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()} RBTree get randomly`, () => {
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()} RBTree add & delete randomly`, () => {
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((value, key) => {
630
- mockCallback(value, key);
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', 1]);
635
- expect(mockCallback.mock.calls[1]).toEqual(['b', 2]);
636
- expect(mockCallback.mock.calls[2]).toEqual(['c', 3]);
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((value, key) => key > 1);
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((value, key) => (key * 2).toString());
649
+ const mappedTree = treeMM.map((key, value) => [(key * 2).toString(), value]);
650
650
  expect(mappedTree.size).toBe(3);
651
651
  expect([...mappedTree]).toEqual([
652
- [1, '2'],
653
- [2, '4'],
654
- [3, '6']
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 extractComparable must be defined in the constructor's options parameter.`
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
- extractComparable: key => key.obj.id
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((value, key) => {
390
- mockCallback(value, key);
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', 1]);
395
- expect(mockCallback.mock.calls[1]).toEqual(['b', 2]);
396
- expect(mockCallback.mock.calls[2]).toEqual(['c', 3]);
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((value, key) => key > 1);
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((value, key) => (key * 2).toString());
409
+ const mappedTree = avl.map((key, value) => [(key * 2).toString(), value]);
410
410
  expect(mappedTree.size).toBe(3);
411
411
  expect([...mappedTree]).toEqual([
412
- [1, '2'],
413
- [2, '4'],
414
- [3, '6']
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
- 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
- });
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((value, key) => {
1346
- mockCallback(value, key);
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', 2]);
1351
- expect(mockCallback.mock.calls[1]).toEqual(['a', 1]);
1352
- expect(mockCallback.mock.calls[2]).toEqual(['c', 3]);
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((value, key) => key > 1);
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((value, key) => (key * 2).toString());
1365
+ const mappedTree = binaryTree.map((key, value) => [(key * 2).toString(), value]);
1366
1366
  expect(mappedTree.size).toBe(3);
1367
1367
  expect([...mappedTree]).toEqual([
1368
- [1, '2'],
1369
- [2, '4'],
1370
- [3, '6']
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, undefined, false);
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
- 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
- });
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>([], { extractComparable: key => key });
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((value, key) => {
1107
- mockCallback(value, key);
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', 1]);
1112
- expect(mockCallback.mock.calls[1]).toEqual(['b', 2]);
1113
- expect(mockCallback.mock.calls[2]).toEqual(['c', 3]);
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((value, key) => key > 1);
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((value, key) => (key * 2).toString());
1133
+ const mappedTree = bst.map((key, value) => [(key * 2).toString(), value]);
1127
1134
  expect(mappedTree.size).toBe(3);
1128
1135
  expect([...mappedTree]).toEqual([
1129
- [1, '2'],
1130
- [2, '4'],
1131
- [3, '6']
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
- const bst = new BST<number>([], { isMapMode: false });
1345
- const node0 = bst.keyValueNodeEntryRawToNodeAndValue(0);
1346
- expect(node0).toEqual([
1347
- {
1348
- _left: undefined,
1349
- _right: undefined,
1350
- key: 0,
1351
- parent: undefined,
1352
- value: undefined
1353
- },
1354
- undefined
1355
- ]);
1356
-
1357
- const nodeUndefined = bst.keyValueNodeEntryRawToNodeAndValue(undefined);
1358
- expect(nodeUndefined).toEqual([undefined, undefined]);
1359
-
1360
- const nodeNull = bst.keyValueNodeEntryRawToNodeAndValue(null);
1361
- expect(nodeNull).toEqual([undefined, undefined]);
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
- // Test case for finding the kth smallest element
1535
- it('@example Find kth smallest element', () => {
1536
- // Create a BST with some elements
1537
- const bst = new BST<number>([5, 3, 7, 1, 4, 6, 8]);
1538
- const sortedKeys = bst.dfs(node => node.key, 'IN');
1539
-
1540
- // Helper function to find kth smallest
1541
- const findKthSmallest = (k: number): number | undefined => {
1542
- return sortedKeys[k - 1];
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
- // Assertions
1546
- expect(findKthSmallest(1)).toBe(1);
1547
- expect(findKthSmallest(3)).toBe(4);
1548
- expect(findKthSmallest(7)).toBe(8);
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.search(new Range(4, 12))).toEqual([10, 12, 5, 7]);
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.search(new Range(15, 20))).toEqual([15, 18]);
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);