data-structure-typed 1.51.7 → 1.51.8

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 (89) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +13 -13
  3. package/benchmark/report.html +13 -13
  4. package/benchmark/report.json +156 -156
  5. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +3 -12
  6. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js +1 -10
  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 +3 -3
  9. package/dist/cjs/data-structures/binary-tree/avl-tree.js +12 -12
  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 +5 -12
  12. package/dist/cjs/data-structures/binary-tree/binary-tree.js +22 -32
  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 +32 -77
  15. package/dist/cjs/data-structures/binary-tree/bst.js +68 -136
  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 +3 -13
  18. package/dist/cjs/data-structures/binary-tree/rb-tree.js +3 -20
  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 +3 -4
  21. package/dist/cjs/data-structures/binary-tree/tree-multi-map.js.map +1 -1
  22. package/dist/cjs/data-structures/heap/heap.d.ts +1 -3
  23. package/dist/cjs/data-structures/heap/heap.js.map +1 -1
  24. package/dist/cjs/interfaces/binary-tree.d.ts +3 -3
  25. package/dist/cjs/types/common.d.ts +1 -1
  26. package/dist/cjs/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +3 -2
  27. package/dist/cjs/types/data-structures/binary-tree/avl-tree.d.ts +3 -2
  28. package/dist/cjs/types/data-structures/binary-tree/binary-tree.d.ts +4 -4
  29. package/dist/cjs/types/data-structures/binary-tree/bst.d.ts +6 -5
  30. package/dist/cjs/types/data-structures/binary-tree/rb-tree.d.ts +4 -3
  31. package/dist/cjs/types/data-structures/binary-tree/tree-multi-map.d.ts +3 -2
  32. package/dist/cjs/types/utils/utils.d.ts +10 -1
  33. package/dist/cjs/utils/utils.d.ts +2 -1
  34. package/dist/cjs/utils/utils.js +29 -1
  35. package/dist/cjs/utils/utils.js.map +1 -1
  36. package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +3 -12
  37. package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.js +1 -10
  38. package/dist/mjs/data-structures/binary-tree/avl-tree.d.ts +3 -3
  39. package/dist/mjs/data-structures/binary-tree/avl-tree.js +12 -12
  40. package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +5 -12
  41. package/dist/mjs/data-structures/binary-tree/binary-tree.js +22 -32
  42. package/dist/mjs/data-structures/binary-tree/bst.d.ts +32 -77
  43. package/dist/mjs/data-structures/binary-tree/bst.js +70 -139
  44. package/dist/mjs/data-structures/binary-tree/rb-tree.d.ts +3 -13
  45. package/dist/mjs/data-structures/binary-tree/rb-tree.js +3 -20
  46. package/dist/mjs/data-structures/binary-tree/tree-multi-map.d.ts +3 -4
  47. package/dist/mjs/data-structures/heap/heap.d.ts +1 -3
  48. package/dist/mjs/interfaces/binary-tree.d.ts +3 -3
  49. package/dist/mjs/types/common.d.ts +1 -1
  50. package/dist/mjs/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +3 -2
  51. package/dist/mjs/types/data-structures/binary-tree/avl-tree.d.ts +3 -2
  52. package/dist/mjs/types/data-structures/binary-tree/binary-tree.d.ts +4 -4
  53. package/dist/mjs/types/data-structures/binary-tree/bst.d.ts +6 -5
  54. package/dist/mjs/types/data-structures/binary-tree/rb-tree.d.ts +4 -3
  55. package/dist/mjs/types/data-structures/binary-tree/tree-multi-map.d.ts +3 -2
  56. package/dist/mjs/types/utils/utils.d.ts +10 -1
  57. package/dist/mjs/utils/utils.d.ts +2 -1
  58. package/dist/mjs/utils/utils.js +27 -0
  59. package/dist/umd/data-structure-typed.js +133 -208
  60. package/dist/umd/data-structure-typed.min.js +4 -4
  61. package/dist/umd/data-structure-typed.min.js.map +1 -1
  62. package/package.json +6 -6
  63. package/src/data-structures/binary-tree/avl-tree-multi-map.ts +4 -12
  64. package/src/data-structures/binary-tree/avl-tree.ts +15 -14
  65. package/src/data-structures/binary-tree/binary-tree.ts +29 -38
  66. package/src/data-structures/binary-tree/bst.ts +78 -148
  67. package/src/data-structures/binary-tree/rb-tree.ts +8 -22
  68. package/src/data-structures/binary-tree/tree-multi-map.ts +4 -3
  69. package/src/data-structures/heap/heap.ts +1 -1
  70. package/src/interfaces/binary-tree.ts +4 -3
  71. package/src/types/common.ts +1 -1
  72. package/src/types/data-structures/binary-tree/avl-tree-multi-map.ts +3 -2
  73. package/src/types/data-structures/binary-tree/avl-tree.ts +3 -2
  74. package/src/types/data-structures/binary-tree/binary-tree.ts +5 -5
  75. package/src/types/data-structures/binary-tree/bst.ts +6 -5
  76. package/src/types/data-structures/binary-tree/rb-tree.ts +4 -3
  77. package/src/types/data-structures/binary-tree/tree-multi-map.ts +3 -2
  78. package/src/types/utils/utils.ts +14 -1
  79. package/src/utils/utils.ts +20 -1
  80. package/test/integration/all-in-one.test.ts +2 -2
  81. package/test/integration/index.html +70 -0
  82. package/test/performance/reportor.ts +2 -3
  83. package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +7 -7
  84. package/test/unit/data-structures/binary-tree/avl-tree.test.ts +2 -2
  85. package/test/unit/data-structures/binary-tree/bst.test.ts +6 -6
  86. package/test/unit/data-structures/binary-tree/overall.test.ts +24 -20
  87. package/test/unit/data-structures/binary-tree/tree-multi-map.test.ts +6 -6
  88. package/test/unit/utils/utils.test.ts +5 -0
  89. package/test/utils/console.ts +1 -1
@@ -1,8 +1,9 @@
1
1
  import { TreeMultiMap, TreeMultiMapNode } from '../../../data-structures';
2
2
  import type { RBTreeOptions } from './rb-tree';
3
+ import { Comparable } from "../../utils";
3
4
 
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>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
5
+ export type TreeMultiMapNodeNested<K extends Comparable, 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>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
5
6
 
6
- export type TreeMultiMapNested<K, V, N extends TreeMultiMapNode<K, V, N>> = TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
7
+ export type TreeMultiMapNested<K extends Comparable, V, N extends TreeMultiMapNode<K, V, N>> = TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
7
8
 
8
9
  export type TreeMultiMapOptions<K> = RBTreeOptions<K> & {}
@@ -5,4 +5,17 @@ export type TrlAsyncFn = (...args: any[]) => any;
5
5
 
6
6
  export type SpecifyOptional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
7
7
 
8
- export type Any = string | number | boolean | object | null | undefined | symbol;
8
+ export type Any = string | number | bigint | boolean | symbol | undefined | object;
9
+
10
+ export type Comparable =
11
+ | number
12
+ | string
13
+ | bigint
14
+ | boolean
15
+ | ({ [key in string]: any } & {
16
+ valueOf(): Comparable;
17
+ })
18
+ | ({ [key in string]: any } & {
19
+ toString(): Comparable;
20
+ })
21
+ | (() => Comparable);
@@ -5,7 +5,7 @@
5
5
  * @copyright Copyright (c) 2022 Tyler Zeng <zrwusa@gmail.com>
6
6
  * @license MIT License
7
7
  */
8
- import type { Thunk, ToThunkFn, TrlAsyncFn, TrlFn } from '../types';
8
+ import type { Comparable, Thunk, ToThunkFn, TrlAsyncFn, TrlFn } from '../types';
9
9
 
10
10
  export const uuidV4 = function () {
11
11
  return 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'.replace(/[x]/g, function (c) {
@@ -105,3 +105,22 @@ export const roundFixed = (num: number, digit: number = 10) => {
105
105
  const multiplier = Math.pow(10, digit);
106
106
  return Math.round(num * multiplier) / multiplier;
107
107
  };
108
+
109
+ export function isComparable(key: any): key is Comparable {
110
+ const keyType = typeof key;
111
+ if (keyType === 'number') return isNaN(key);
112
+ if (keyType === 'string') return true;
113
+ if (keyType === 'bigint') return true;
114
+ if (keyType === 'boolean') return true;
115
+ if (keyType === 'symbol') return false;
116
+ if (keyType === 'undefined') return false;
117
+ if (keyType === 'function') return isComparable(key());
118
+ if (keyType === 'object') {
119
+ if (key === null) return true;
120
+ if (typeof key.valueOf === 'function') return isComparable(key.valueOf());
121
+ if (typeof key.toString === 'function') return isComparable(key.toString());
122
+ return false;
123
+ }
124
+
125
+ return false;
126
+ }
@@ -3,7 +3,7 @@ import { AVLTree } from 'data-structure-typed';
3
3
  describe('AVL Tree Test from data-structure-typed', () => {
4
4
  it('should perform various operations on a AVL Tree from data-structure-typed', () => {
5
5
  const keys = [11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
6
- const tree = new AVLTree();
6
+ const tree = new AVLTree<number>();
7
7
 
8
8
  for (const i of keys) tree.add([i, i]);
9
9
 
@@ -27,7 +27,7 @@ describe('AVL Tree Test from data-structure-typed', () => {
27
27
  expect(subTreeSum).toBe(70);
28
28
 
29
29
  let lesserSum = 0;
30
- tree.lesserOrGreaterTraverse(node => (lesserSum += node.key), 'LT', 10);
30
+ tree.lesserOrGreaterTraverse(node => (lesserSum += node.key), -1, 10);
31
31
  expect(lesserSum).toBe(45);
32
32
 
33
33
  // 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.
@@ -371,6 +371,76 @@
371
371
  } catch (e) {
372
372
  console.error(e);
373
373
  }
374
+
375
+ function heapTest() {
376
+ const heap = new dataStructureTyped.Heap([], { comparator: (a, b) => b - a });
377
+
378
+ heap.add(10);
379
+ heap.add(5);
380
+ heap.add(15);
381
+
382
+ const max = heap.poll();
383
+ console.log(max); // 15
384
+
385
+ const max2 = heap.peek();
386
+ console.log(max2); // 15
387
+
388
+ let isEmpty = heap.isEmpty();
389
+ console.log(isEmpty); // false
390
+
391
+ heap.clear();
392
+ isEmpty = heap.isEmpty();
393
+ console.log(isEmpty); // true
394
+
395
+ const minNumHeap = new dataStructureTyped.MinHeap([1, 6, 2, 0, 5]);
396
+ minNumHeap.add(9);
397
+ minNumHeap.has(1) // true
398
+ minNumHeap.has(2) // true
399
+ minNumHeap.poll() // 0
400
+ minNumHeap.poll() // 1
401
+ minNumHeap.peek() // 2
402
+ minNumHeap.has(1); // false
403
+ minNumHeap.has(2); // true
404
+
405
+ const arrFromHeap = minNumHeap.toArray();
406
+ arrFromHeap.length // 4
407
+ arrFromHeap[0] // 2
408
+ arrFromHeap[1] // 5
409
+ arrFromHeap[2] // 9
410
+ arrFromHeap[3] // 6
411
+ minNumHeap.sort() // [2, 5, 6, 9]
412
+
413
+ const maxHeap = new dataStructureTyped.MaxHeap([], { comparator: (a, b) => b.keyA - a.keyA });
414
+ const obj1 = { keyA: 'a1' }, obj6 = { keyA: 'a6' }, obj5 = { keyA: 'a5' }, obj2 = { keyA: 'a2' },
415
+ obj0 = { keyA: 'a0' }, obj9 = { keyA: 'a9' };
416
+
417
+ maxHeap.add(obj1);
418
+ maxHeap.has(obj1) // true
419
+ maxHeap.has(obj9) // false
420
+ maxHeap.add(obj6);
421
+ maxHeap.has(obj6) // true
422
+ maxHeap.add(obj5);
423
+ maxHeap.add(obj2);
424
+ maxHeap.add(obj0);
425
+ maxHeap.add(obj9);
426
+ maxHeap.has(obj9) // true
427
+
428
+ const peek9 = maxHeap.peek();
429
+ console.log(peek9.keyA) // 'a9'
430
+
431
+ const heapToArr = maxHeap.toArray();
432
+ console.log(heapToArr.map(ele => ele?.keyA)); // ['a9', 'a2', 'a6', 'a1', 'a0', 'a5']
433
+
434
+ const values = ['a9', 'a6', 'a5', 'a2', 'a1', 'a0'];
435
+ let i = 0;
436
+ while (maxHeap.size > 0) {
437
+ const polled = maxHeap.poll();
438
+ console.log(polled.keyA) // values[i]
439
+ i++;
440
+ }
441
+ }
442
+
443
+
374
444
  </script>
375
445
 
376
446
  </body>
@@ -2,13 +2,12 @@ import * as Benchmark from 'benchmark';
2
2
  import * as path from 'path';
3
3
  import * as fs from 'fs';
4
4
  import * as fastGlob from 'fast-glob';
5
- import { Color, numberFix, render } from '../utils';
5
+ import { ConsoleColor, numberFix, render } from '../utils';
6
6
  import { PerformanceTest } from './types';
7
- import * as console from 'console';
8
7
 
9
8
  const args = process.argv.slice(2);
10
9
 
11
- const { GREEN, BOLD, END, YELLOW, GRAY, CYAN, BG_YELLOW } = Color;
10
+ const { GREEN, BOLD, END, YELLOW, GRAY, CYAN, BG_YELLOW } = ConsoleColor;
12
11
 
13
12
  const getRelativePath = (file: string) => {
14
13
  return path.relative(__dirname, file);
@@ -28,7 +28,7 @@ describe('AVLTreeMultiMap count', () => {
28
28
  [3, 3]
29
29
  ]);
30
30
  tm.add([2, 2], undefined, 10);
31
- tm.lesserOrGreaterTraverse(node => (node.count += 2), 'GT', 1);
31
+ tm.lesserOrGreaterTraverse(node => (node.count += 2), 1, 1);
32
32
  tm.delete(2);
33
33
  expect(tm.count).toBe(12);
34
34
  expect(tm.getComputedCount()).toBe(16);
@@ -37,7 +37,7 @@ describe('AVLTreeMultiMap count', () => {
37
37
 
38
38
  describe('AVLTreeMultiMap operations test1', () => {
39
39
  it('should perform various operations on a Binary Search Tree with numeric values1', () => {
40
- const treeMultimap = new AVLTreeMultiMap();
40
+ const treeMultimap = new AVLTreeMultiMap<number>();
41
41
 
42
42
  expect(treeMultimap instanceof AVLTreeMultiMap);
43
43
  treeMultimap.add([11, 11]);
@@ -94,7 +94,7 @@ describe('AVLTreeMultiMap operations test1', () => {
94
94
  node15 && treeMultimap.dfs(node => (subTreeSum += node.key), 'PRE', 15);
95
95
  expect(subTreeSum).toBe(31);
96
96
  let lesserSum = 0;
97
- treeMultimap.lesserOrGreaterTraverse((node: AVLTreeMultiMapNode<number>) => (lesserSum += node.key), 'LT', 10);
97
+ treeMultimap.lesserOrGreaterTraverse((node: AVLTreeMultiMapNode<number>) => (lesserSum += node.key), -1, 10);
98
98
  expect(lesserSum).toBe(45);
99
99
 
100
100
  expect(node15 instanceof AVLTreeMultiMapNode);
@@ -105,7 +105,7 @@ describe('AVLTreeMultiMap operations test1', () => {
105
105
  const node11 = treeMultimap.getNode(11);
106
106
  expect(node11 instanceof AVLTreeMultiMapNode);
107
107
  if (node11 instanceof AVLTreeMultiMapNode) {
108
- const allGreaterNodesAdded = treeMultimap.lesserOrGreaterTraverse(node => (node.count += 2), 'GT', 11);
108
+ const allGreaterNodesAdded = treeMultimap.lesserOrGreaterTraverse(node => (node.count += 2), 1, 11);
109
109
  expect(allGreaterNodesAdded);
110
110
  }
111
111
 
@@ -348,7 +348,7 @@ describe('AVLTreeMultiMap operations test recursively1', () => {
348
348
  node15 && treeMultimap.dfs(node => (subTreeSum += node.key), 'PRE', 15);
349
349
  expect(subTreeSum).toBe(31);
350
350
  let lesserSum = 0;
351
- treeMultimap.lesserOrGreaterTraverse((node: AVLTreeMultiMapNode<number>) => (lesserSum += node.key), 'LT', 10);
351
+ treeMultimap.lesserOrGreaterTraverse((node: AVLTreeMultiMapNode<number>) => (lesserSum += node.key), -1, 10);
352
352
  expect(lesserSum).toBe(45);
353
353
 
354
354
  expect(node15 instanceof AVLTreeMultiMapNode);
@@ -359,7 +359,7 @@ describe('AVLTreeMultiMap operations test recursively1', () => {
359
359
  const node11 = treeMultimap.getNode(11);
360
360
  expect(node11 instanceof AVLTreeMultiMapNode);
361
361
  if (node11 instanceof AVLTreeMultiMapNode) {
362
- const allGreaterNodesAdded = treeMultimap.lesserOrGreaterTraverse(node => (node.count += 2), 'GT', 11);
362
+ const allGreaterNodesAdded = treeMultimap.lesserOrGreaterTraverse(node => (node.count += 2), 1, 11);
363
363
  expect(allGreaterNodesAdded);
364
364
  }
365
365
 
@@ -564,7 +564,7 @@ describe('AVLTreeMultiMap Performance test', function () {
564
564
  }
565
565
  isDebug && console.log('---add', performance.now() - start);
566
566
  const startL = performance.now();
567
- treeMS.lesserOrGreaterTraverse(node => (node.count += 1), 'LT', inputSize / 2);
567
+ treeMS.lesserOrGreaterTraverse(node => (node.count += 1), -1, inputSize / 2);
568
568
  isDebug && console.log('---lesserOrGreaterTraverse', performance.now() - startL);
569
569
  });
570
570
 
@@ -28,7 +28,7 @@ describe('AVL Tree Test', () => {
28
28
  expect(subTreeSum).toBe(70);
29
29
 
30
30
  let lesserSum = 0;
31
- tree.lesserOrGreaterTraverse(node => (lesserSum += node.key), 'LT', 10);
31
+ tree.lesserOrGreaterTraverse(node => (lesserSum += node.key), -1, 10);
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.
@@ -136,7 +136,7 @@ describe('AVL Tree Test recursively', () => {
136
136
  expect(subTreeSum).toBe(70);
137
137
 
138
138
  let lesserSum = 0;
139
- tree.lesserOrGreaterTraverse(node => (lesserSum += node.key), 'LT', 10);
139
+ tree.lesserOrGreaterTraverse(node => (lesserSum += node.key), -1, 10);
140
140
  expect(lesserSum).toBe(45);
141
141
 
142
142
  // 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.
@@ -58,7 +58,7 @@ describe('BST operations test', () => {
58
58
  expect(subTreeSum).toBe(70);
59
59
 
60
60
  let lesserSum = 0;
61
- bst.lesserOrGreaterTraverse(node => (lesserSum += node.key), 'LT', 10);
61
+ bst.lesserOrGreaterTraverse(node => (lesserSum += node.key), -1, 10);
62
62
  expect(lesserSum).toBe(45);
63
63
 
64
64
  expect(node15).toBeInstanceOf(BSTNode);
@@ -261,7 +261,7 @@ describe('BST operations test', () => {
261
261
  expect(subTreeSum).toBe(70);
262
262
 
263
263
  let lesserSum = 0;
264
- objBST.lesserOrGreaterTraverse(node => (lesserSum += node.key), 'LT', 10);
264
+ objBST.lesserOrGreaterTraverse(node => (lesserSum += node.key), -1, 10);
265
265
  expect(lesserSum).toBe(45);
266
266
 
267
267
  expect(node15).toBeInstanceOf(BSTNode);
@@ -448,7 +448,7 @@ describe('BST operations test recursively', () => {
448
448
  expect(subTreeSum).toBe(70);
449
449
 
450
450
  let lesserSum = 0;
451
- bst.lesserOrGreaterTraverse(node => (lesserSum += node.key), 'LT', 10);
451
+ bst.lesserOrGreaterTraverse(node => (lesserSum += node.key), -1, 10);
452
452
  expect(lesserSum).toBe(45);
453
453
 
454
454
  expect(node15).toBeInstanceOf(BSTNode);
@@ -649,7 +649,7 @@ describe('BST operations test recursively', () => {
649
649
  expect(subTreeSum).toBe(70);
650
650
 
651
651
  let lesserSum = 0;
652
- objBST.lesserOrGreaterTraverse(node => (lesserSum += node.key), 'LT', 10);
652
+ objBST.lesserOrGreaterTraverse(node => (lesserSum += node.key), -1, 10);
653
653
  expect(lesserSum).toBe(45);
654
654
 
655
655
  expect(node15).toBeInstanceOf(BSTNode);
@@ -869,7 +869,7 @@ describe('BST isBST', function () {
869
869
  });
870
870
 
871
871
  test('isBST when variant is Max', () => {
872
- const bst = new BST<number, number>([1, 2, 3, 9, 8, 5, 6, 7, 4], { variant: 'INVERSE' });
872
+ const bst = new BST<number, number>([1, 2, 3, 9, 8, 5, 6, 7, 4], { comparator: (a, b) => b - a });
873
873
  bst.addMany([1, 2, 3, 9, 8, 5, 6, 7, 4]);
874
874
  expect(bst.isBST()).toBe(true);
875
875
  });
@@ -902,7 +902,7 @@ describe('BST Performance test', function () {
902
902
  node => {
903
903
  node.key - 1;
904
904
  },
905
- 'LT',
905
+ -1,
906
906
  inputSize / 2
907
907
  );
908
908
  isDebug && console.log('---lesserOrGreaterTraverse', performance.now() - startL);
@@ -2,7 +2,7 @@ import { AVLTree, BST, RedBlackTree, TreeMultiMap } from '../../../../src';
2
2
 
3
3
  describe('Overall BinaryTree Test', () => {
4
4
  it('should perform various operations on BinaryTree', () => {
5
- const bst = new BST();
5
+ const bst = new BST<number>();
6
6
  bst.add(11);
7
7
  bst.add(3);
8
8
  bst.addMany([15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5], undefined, false);
@@ -64,16 +64,19 @@ describe('Overall BinaryTree Test', () => {
64
64
  it('Should clone a BST works fine', () => {
65
65
  const bst = new BST<number>([3, 6, 7, 1, 9], {
66
66
  iterationType: 'RECURSIVE',
67
- variant: 'INVERSE',
68
- extractor: key => key
67
+ comparator: (a, b) => {
68
+ if (a > b) return -1;
69
+ if (a < b) return 1;
70
+ return 0;
71
+ }
69
72
  });
70
73
  expect(bst.size).toBe(5);
71
74
  expect(bst.root?.key).toBe(6);
72
- expect(bst.root?.left?.key).toBe(7);
73
- expect(bst.root?.left?.left?.key).toBe(9);
74
- expect(bst.root?.right?.key).toBe(1);
75
- expect(bst.root?.right?.left?.key).toBe(3);
76
- expect(bst.getNodeByKey(7)?.left?.key).toBe(9);
75
+ expect(bst.root?.left?.key).toBe(9);
76
+ expect(bst.root?.left?.right?.key).toBe(7);
77
+ expect(bst.root?.right?.key).toBe(3);
78
+ expect(bst.root?.right?.right?.key).toBe(1);
79
+ expect(bst.getNodeByKey(9)?.right?.key).toBe(7);
77
80
  expect(bst.getHeight()).toBe(2);
78
81
  expect(bst.has(9)).toBe(true);
79
82
  expect(bst.has(7)).toBe(true);
@@ -82,31 +85,34 @@ describe('Overall BinaryTree Test', () => {
82
85
  expect(bst.size).toBe(4);
83
86
  expect(bst.root?.key).toBe(6);
84
87
  expect(bst.root?.left?.key).toBe(9);
85
- expect(bst.root?.right?.key).toBe(1);
86
- expect(bst.root?.right?.left?.key).toBe(3);
88
+ expect(bst.root?.right?.key).toBe(3);
89
+ expect(bst.root?.right?.right?.key).toBe(1);
87
90
  expect(bst.getNodeByKey(6)?.left?.key).toBe(9);
88
91
  expect(bst.getHeight()).toBe(2);
89
92
  expect(bst.has(9)).toBe(true);
90
93
  expect(bst.has(7)).toBe(false);
91
- expect(bst.bfs()).toEqual([6, 9, 1, 3]);
94
+ expect(bst.bfs()).toEqual([6, 9, 3, 1]);
92
95
  const clonedBST = bst.clone();
93
96
  expect(clonedBST.size).toBe(4);
94
97
  expect(clonedBST.root?.key).toBe(6);
95
98
  expect(clonedBST.root?.left?.key).toBe(9);
96
- expect(clonedBST.root?.right?.key).toBe(1);
97
- expect(clonedBST.root?.right?.left?.key).toBe(3);
99
+ expect(clonedBST.root?.right?.key).toBe(3);
100
+ expect(clonedBST.root?.right?.right?.key).toBe(1);
98
101
  expect(clonedBST.getNodeByKey(6)?.left?.key).toBe(9);
99
102
  expect(clonedBST.getHeight()).toBe(2);
100
103
  expect(clonedBST.has(9)).toBe(true);
101
104
  expect(clonedBST.has(7)).toBe(false);
102
- expect(clonedBST.bfs()).toEqual([6, 9, 1, 3]);
105
+ expect(clonedBST.bfs()).toEqual([6, 9, 3, 1]);
103
106
  });
104
107
 
105
108
  it('Should clone a AVLTree works fine', () => {
106
109
  const avl = new AVLTree<number>([3, 6, 7, 1, 9], {
107
110
  iterationType: 'RECURSIVE',
108
- variant: 'INVERSE',
109
- extractor: key => key
111
+ comparator: (a, b) => {
112
+ if (a > b) return -1;
113
+ if (a < b) return 1;
114
+ return 0;
115
+ }
110
116
  });
111
117
  expect(avl.size).toBe(5);
112
118
  avl.add(2);
@@ -148,8 +154,7 @@ describe('Overall BinaryTree Test', () => {
148
154
 
149
155
  it('Should clone a TreeMultiMap works fine', () => {
150
156
  const tmm = new TreeMultiMap<number>([3, 6, 7, 1, 9], {
151
- iterationType: 'RECURSIVE',
152
- extractor: key => key
157
+ iterationType: 'RECURSIVE'
153
158
  });
154
159
  expect(tmm.size).toBe(5);
155
160
  tmm.add(2);
@@ -197,8 +202,7 @@ describe('Overall BinaryTree Test', () => {
197
202
 
198
203
  it('Should clone a RedBlackTree works fine', () => {
199
204
  const rbTree = new RedBlackTree<number>([3, 6, 7, 1, 9], {
200
- iterationType: 'RECURSIVE',
201
- extractor: key => key
205
+ iterationType: 'RECURSIVE'
202
206
  });
203
207
  expect(rbTree.size).toBe(5);
204
208
  rbTree.add(2);
@@ -32,7 +32,7 @@ describe('TreeMultiMap count', () => {
32
32
  [2, 2],
33
33
  [3, 3]
34
34
  ]);
35
- tmm.lesserOrGreaterTraverse(node => (node.count += 2), 'GT', 1);
35
+ tmm.lesserOrGreaterTraverse(node => (node.count += 2), 1, 1);
36
36
  expect(tmm.getComputedCount()).toBe(7);
37
37
  expect(tmm.count).toBe(3);
38
38
  });
@@ -93,7 +93,7 @@ describe('TreeMultiMap operations test1', () => {
93
93
  });
94
94
 
95
95
  it('should perform various operations on a Binary Search Tree with numeric values1', () => {
96
- const tmm = new TreeMultiMap();
96
+ const tmm = new TreeMultiMap<number, number>();
97
97
 
98
98
  expect(tmm instanceof TreeMultiMap);
99
99
 
@@ -152,7 +152,7 @@ describe('TreeMultiMap operations test1', () => {
152
152
  node15 && tmm.dfs(node => (subTreeSum += node.key), 'PRE', 15);
153
153
  expect(subTreeSum).toBe(45);
154
154
  let lesserSum = 0;
155
- tmm.lesserOrGreaterTraverse((node: TreeMultiMapNode<number>) => (lesserSum += node.key), 'LT', 10);
155
+ tmm.lesserOrGreaterTraverse(node => (lesserSum += node.key), -1, 10);
156
156
  expect(lesserSum).toBe(45);
157
157
 
158
158
  expect(node15 instanceof TreeMultiMapNode);
@@ -163,7 +163,7 @@ describe('TreeMultiMap operations test1', () => {
163
163
  const node11 = tmm.getNode(11);
164
164
  expect(node11 instanceof TreeMultiMapNode);
165
165
  if (node11 instanceof TreeMultiMapNode) {
166
- const allGreaterNodesAdded = tmm.lesserOrGreaterTraverse(node => (node.count += 2), 'GT', 11);
166
+ const allGreaterNodesAdded = tmm.lesserOrGreaterTraverse(node => (node.count += 2), 1, 11);
167
167
  expect(allGreaterNodesAdded);
168
168
  }
169
169
 
@@ -414,7 +414,7 @@ describe('TreeMultiMap operations test recursively1', () => {
414
414
  lesserSum += node.key;
415
415
  return node.key;
416
416
  },
417
- 'LT',
417
+ -1,
418
418
  10
419
419
  );
420
420
  expect(lesserSum).toBe(45);
@@ -427,7 +427,7 @@ describe('TreeMultiMap operations test recursively1', () => {
427
427
  const node11 = tmm.getNode(11);
428
428
  expect(node11 instanceof TreeMultiMapNode);
429
429
  if (node11 instanceof TreeMultiMapNode) {
430
- const allGreaterNodesAdded = tmm.lesserOrGreaterTraverse(node => (node.count += 2), 'GT', 11);
430
+ const allGreaterNodesAdded = tmm.lesserOrGreaterTraverse(node => (node.count += 2), 1, 11);
431
431
  expect(allGreaterNodesAdded);
432
432
  }
433
433
 
@@ -0,0 +1,5 @@
1
+ describe('isNaN', () => {
2
+ it('should isNaN', function () {
3
+ expect(isNaN('string' as unknown as number)).toBe(true);
4
+ });
5
+ });
@@ -1,4 +1,4 @@
1
- export const Color = {
1
+ export const ConsoleColor = {
2
2
  END: '\x1b[0m',
3
3
  BOLD: '\x1b[1m',
4
4
  DIM: '\x1b[2m',