data-structure-typed 1.42.3 → 1.42.5

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 (74) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +17 -17
  3. package/benchmark/report.html +12 -12
  4. package/benchmark/report.json +106 -106
  5. package/dist/cjs/src/data-structures/binary-tree/avl-tree.d.ts +2 -2
  6. package/dist/cjs/src/data-structures/binary-tree/avl-tree.js +5 -3
  7. package/dist/cjs/src/data-structures/binary-tree/avl-tree.js.map +1 -1
  8. package/dist/cjs/src/data-structures/binary-tree/binary-tree.d.ts +56 -52
  9. package/dist/cjs/src/data-structures/binary-tree/binary-tree.js +115 -53
  10. package/dist/cjs/src/data-structures/binary-tree/binary-tree.js.map +1 -1
  11. package/dist/cjs/src/data-structures/binary-tree/bst.d.ts +42 -15
  12. package/dist/cjs/src/data-structures/binary-tree/bst.js +77 -21
  13. package/dist/cjs/src/data-structures/binary-tree/bst.js.map +1 -1
  14. package/dist/cjs/src/data-structures/binary-tree/index.d.ts +1 -1
  15. package/dist/cjs/src/data-structures/binary-tree/index.js +1 -1
  16. package/dist/cjs/src/data-structures/binary-tree/rb-tree.d.ts +28 -51
  17. package/dist/cjs/src/data-structures/binary-tree/rb-tree.js +148 -180
  18. package/dist/cjs/src/data-structures/binary-tree/rb-tree.js.map +1 -1
  19. package/dist/cjs/src/data-structures/binary-tree/{tree-multiset.d.ts → tree-multimap.d.ts} +20 -20
  20. package/dist/cjs/src/data-structures/binary-tree/{tree-multiset.js → tree-multimap.js} +35 -32
  21. package/dist/cjs/src/data-structures/binary-tree/tree-multimap.js.map +1 -0
  22. package/dist/cjs/src/types/data-structures/binary-tree/binary-tree.d.ts +1 -1
  23. package/dist/cjs/src/types/data-structures/binary-tree/index.d.ts +1 -1
  24. package/dist/cjs/src/types/data-structures/binary-tree/index.js +1 -1
  25. package/dist/cjs/src/types/data-structures/binary-tree/rb-tree.d.ts +4 -0
  26. package/dist/cjs/src/types/data-structures/binary-tree/rb-tree.js +0 -5
  27. package/dist/cjs/src/types/data-structures/binary-tree/rb-tree.js.map +1 -1
  28. package/dist/cjs/src/types/data-structures/binary-tree/tree-multimap.d.ts +4 -0
  29. package/dist/cjs/src/types/data-structures/binary-tree/{tree-multiset.js → tree-multimap.js} +1 -1
  30. package/dist/cjs/src/types/data-structures/binary-tree/tree-multimap.js.map +1 -0
  31. package/dist/mjs/src/data-structures/binary-tree/avl-tree.d.ts +2 -2
  32. package/dist/mjs/src/data-structures/binary-tree/avl-tree.js +5 -3
  33. package/dist/mjs/src/data-structures/binary-tree/binary-tree.d.ts +56 -52
  34. package/dist/mjs/src/data-structures/binary-tree/binary-tree.js +115 -53
  35. package/dist/mjs/src/data-structures/binary-tree/bst.d.ts +42 -15
  36. package/dist/mjs/src/data-structures/binary-tree/bst.js +79 -21
  37. package/dist/mjs/src/data-structures/binary-tree/index.d.ts +1 -1
  38. package/dist/mjs/src/data-structures/binary-tree/index.js +1 -1
  39. package/dist/mjs/src/data-structures/binary-tree/rb-tree.d.ts +28 -51
  40. package/dist/mjs/src/data-structures/binary-tree/rb-tree.js +148 -184
  41. package/dist/mjs/src/data-structures/binary-tree/{tree-multiset.d.ts → tree-multimap.d.ts} +20 -20
  42. package/dist/mjs/src/data-structures/binary-tree/{tree-multiset.js → tree-multimap.js} +33 -31
  43. package/dist/mjs/src/types/data-structures/binary-tree/binary-tree.d.ts +1 -1
  44. package/dist/mjs/src/types/data-structures/binary-tree/index.d.ts +1 -1
  45. package/dist/mjs/src/types/data-structures/binary-tree/index.js +1 -1
  46. package/dist/mjs/src/types/data-structures/binary-tree/rb-tree.d.ts +4 -0
  47. package/dist/mjs/src/types/data-structures/binary-tree/rb-tree.js +0 -5
  48. package/dist/mjs/src/types/data-structures/binary-tree/tree-multimap.d.ts +4 -0
  49. package/dist/umd/data-structure-typed.min.js +1 -1
  50. package/dist/umd/data-structure-typed.min.js.map +1 -1
  51. package/package.json +5 -3
  52. package/src/data-structures/binary-tree/avl-tree.ts +5 -4
  53. package/src/data-structures/binary-tree/binary-tree.ts +201 -131
  54. package/src/data-structures/binary-tree/bst.ts +100 -34
  55. package/src/data-structures/binary-tree/index.ts +1 -1
  56. package/src/data-structures/binary-tree/rb-tree.ts +227 -236
  57. package/src/data-structures/binary-tree/{tree-multiset.ts → tree-multimap.ts} +38 -37
  58. package/src/types/data-structures/binary-tree/binary-tree.ts +1 -1
  59. package/src/types/data-structures/binary-tree/index.ts +1 -1
  60. package/src/types/data-structures/binary-tree/rb-tree.ts +5 -5
  61. package/src/types/data-structures/binary-tree/tree-multimap.ts +6 -0
  62. package/test/performance/data-structures/binary-tree/rb-tree.test.ts +2 -2
  63. package/test/unit/data-structures/binary-tree/avl-tree.test.ts +20 -1
  64. package/test/unit/data-structures/binary-tree/binary-tree.test.ts +12 -31
  65. package/test/unit/data-structures/binary-tree/bst.test.ts +3 -3
  66. package/test/unit/data-structures/binary-tree/rb-tree.test.ts +205 -159
  67. package/test/unit/data-structures/binary-tree/{tree-multiset.test.ts → tree-multimap.test.ts} +182 -182
  68. package/dist/cjs/src/data-structures/binary-tree/tree-multiset.js.map +0 -1
  69. package/dist/cjs/src/types/data-structures/binary-tree/tree-multiset.d.ts +0 -4
  70. package/dist/cjs/src/types/data-structures/binary-tree/tree-multiset.js.map +0 -1
  71. package/dist/mjs/src/types/data-structures/binary-tree/tree-multiset.d.ts +0 -4
  72. package/src/types/data-structures/binary-tree/tree-multiset.ts +0 -6
  73. /package/dist/mjs/src/types/data-structures/binary-tree/{tree-multiset.js → tree-multimap.js} +0 -0
  74. /package/test/performance/data-structures/binary-tree/{tree-multiset.test.ts → tree-multimap.test.ts} +0 -0
@@ -5,14 +5,14 @@
5
5
  * @copyright Copyright (c) 2022 Tyler Zeng <zrwusa@gmail.com>
6
6
  * @license MIT License
7
7
  */
8
- import type {BTNKey, TreeMultisetNodeNested, TreeMultisetOptions} from '../../types';
8
+ import type {BTNKey, TreeMultimapNodeNested, TreeMultimapOptions} from '../../types';
9
9
  import {BinaryTreeDeletedResult, BTNCallback, CP, FamilyPosition, IterationType} from '../../types';
10
10
  import {IBinaryTree} from '../../interfaces';
11
11
  import {AVLTree, AVLTreeNode} from './avl-tree';
12
12
 
13
- export class TreeMultisetNode<
13
+ export class TreeMultimapNode<
14
14
  V = any,
15
- N extends TreeMultisetNode<V, N> = TreeMultisetNodeNested<V>
15
+ N extends TreeMultimapNode<V, N> = TreeMultimapNodeNested<V>
16
16
  > extends AVLTreeNode<V, N> {
17
17
  count: number;
18
18
 
@@ -33,19 +33,19 @@ export class TreeMultisetNode<
33
33
  }
34
34
 
35
35
  /**
36
- * The only distinction between a TreeMultiset and a AVLTree lies in the ability of the former to store duplicate nodes through the utilization of counters.
36
+ * The only distinction between a TreeMultimap and a AVLTree lies in the ability of the former to store duplicate nodes through the utilization of counters.
37
37
  */
38
- export class TreeMultiset<V = any, N extends TreeMultisetNode<V, N> = TreeMultisetNode<V, TreeMultisetNodeNested<V>>>
38
+ export class TreeMultimap<V = any, N extends TreeMultimapNode<V, N> = TreeMultimapNode<V, TreeMultimapNodeNested<V>>>
39
39
  extends AVLTree<V, N>
40
40
  implements IBinaryTree<V, N>
41
41
  {
42
42
  /**
43
- * The constructor function for a TreeMultiset class in TypeScript, which extends another class and sets an option to
43
+ * The constructor function for a TreeMultimap class in TypeScript, which extends another class and sets an option to
44
44
  * merge duplicated values.
45
- * @param {TreeMultisetOptions} [options] - An optional object that contains additional configuration options for the
46
- * TreeMultiset.
45
+ * @param {TreeMultimapOptions} [options] - An optional object that contains additional configuration options for the
46
+ * TreeMultimap.
47
47
  */
48
- constructor(options?: TreeMultisetOptions) {
48
+ constructor(options?: TreeMultimapOptions) {
49
49
  super(options);
50
50
  }
51
51
 
@@ -65,29 +65,30 @@ export class TreeMultiset<V = any, N extends TreeMultisetNode<V, N> = TreeMultis
65
65
  * @returns A new instance of the BSTNode class with the specified key, value, and count (if provided).
66
66
  */
67
67
  override createNode(key: BTNKey, value?: V, count?: number): N {
68
- return new TreeMultisetNode(key, value, count) as N;
68
+ return new TreeMultimapNode(key, value, count) as N;
69
69
  }
70
70
 
71
71
  /**
72
72
  * The `add` function adds a new node to a binary search tree, updating the count if the key already
73
73
  * exists, and balancing the tree if necessary.
74
- * @param {BTNKey | N | null} keyOrNode - The `keyOrNode` parameter can be either a
74
+ * @param {BTNKey | N | undefined} keyOrNode - The `keyOrNode` parameter can be either a
75
75
  * `BTNKey` (which represents the key of the node to be added), a `N` (which represents a
76
- * node to be added), or `null` (which represents a null node).
76
+ * node to be added), or `undefined` (which represents a undefined node).
77
77
  * @param [value] - The `value` parameter represents the value associated with the key that is being
78
78
  * added to the binary tree.
79
79
  * @param [count=1] - The `count` parameter represents the number of occurrences of the key/value
80
80
  * pair that will be added to the binary tree. It has a default value of 1, which means that if no
81
81
  * count is specified, the default count will be 1.
82
- * @returns The function `add` returns a value of type `N | null | undefined`.
82
+ * @returns The function `add` returns a value of type `N | undefined | undefined`.
83
83
  */
84
- override add(keyOrNode: BTNKey | N | null, value?: V, count = 1): N | null | undefined {
85
- let inserted: N | null | undefined = undefined,
86
- newNode: N | null;
87
- if (keyOrNode instanceof TreeMultisetNode) {
84
+ override add(keyOrNode: BTNKey | N | null | undefined, value?: V, count = 1): N | undefined {
85
+ if(keyOrNode === null) return undefined;
86
+ let inserted: N | undefined = undefined,
87
+ newNode: N | undefined;
88
+ if (keyOrNode instanceof TreeMultimapNode) {
88
89
  newNode = this.createNode(keyOrNode.key, keyOrNode.value, keyOrNode.count);
89
- } else if (keyOrNode === null) {
90
- newNode = null;
90
+ } else if (keyOrNode === undefined) {
91
+ newNode = undefined;
91
92
  } else {
92
93
  newNode = this.createNode(keyOrNode, value, count);
93
94
  }
@@ -138,7 +139,7 @@ export class TreeMultiset<V = any, N extends TreeMultisetNode<V, N> = TreeMultis
138
139
  }
139
140
  }
140
141
  } else {
141
- // TODO may need to support null inserted
142
+ // TODO may need to support undefined inserted
142
143
  }
143
144
  } else {
144
145
  traversing = false;
@@ -151,17 +152,17 @@ export class TreeMultiset<V = any, N extends TreeMultisetNode<V, N> = TreeMultis
151
152
 
152
153
  /**
153
154
  * The function adds a new node to a binary tree if there is an available slot in the parent node.
154
- * @param {N | null} newNode - The `newNode` parameter represents the node that needs to be added to
155
- * the tree. It can be either a node object (`N`) or `null`.
155
+ * @param {N | undefined} newNode - The `newNode` parameter represents the node that needs to be added to
156
+ * the tree. It can be either a node object (`N`) or `undefined`.
156
157
  * @param {N} parent - The `parent` parameter represents the parent node to which the new node will
157
158
  * be added as a child.
158
159
  * @returns The method `_addTo` returns either the `parent.left`, `parent.right`, or `undefined`.
159
160
  */
160
- override _addTo(newNode: N | null, parent: N): N | null | undefined {
161
+ override _addTo(newNode: N | undefined, parent: N): N | undefined {
161
162
  if (parent) {
162
163
  if (parent.left === undefined) {
163
164
  parent.left = newNode;
164
- if (newNode !== null) {
165
+ if (newNode !== undefined) {
165
166
  this._size = this.size + 1;
166
167
  this._setCount(this.count + newNode.count);
167
168
  }
@@ -169,7 +170,7 @@ export class TreeMultiset<V = any, N extends TreeMultisetNode<V, N> = TreeMultis
169
170
  return parent.left;
170
171
  } else if (parent.right === undefined) {
171
172
  parent.right = newNode;
172
- if (newNode !== null) {
173
+ if (newNode !== undefined) {
173
174
  this._size = this.size + 1;
174
175
  this._setCount(this.count + newNode.count);
175
176
  }
@@ -183,27 +184,27 @@ export class TreeMultiset<V = any, N extends TreeMultisetNode<V, N> = TreeMultis
183
184
  }
184
185
 
185
186
  /**
186
- * The `addMany` function adds multiple keys or nodes to a TreeMultiset and returns an array of the
187
+ * The `addMany` function adds multiple keys or nodes to a TreeMultimap and returns an array of the
187
188
  * inserted nodes.
188
- * @param {(BTNKey | null)[] | (N | null)[]} keysOrNodes - An array of keys or nodes to be
189
- * added to the multiset. Each element can be either a BTNKey or a TreeMultisetNode.
189
+ * @param {(BTNKey | undefined)[] | (N | undefined)[]} keysOrNodes - An array of keys or nodes to be
190
+ * added to the multiset. Each element can be either a BTNKey or a TreeMultimapNode.
190
191
  * @param {V[]} [data] - The `data` parameter is an optional array of values that correspond
191
192
  * to the keys or nodes being added to the multiset. It is used to associate additional data with
192
193
  * each key or node.
193
- * @returns The function `addMany` returns an array of `N`, `null`, or `undefined` values.
194
+ * @returns The function `addMany` returns an array of `N`, `undefined`, or `undefined` values.
194
195
  */
195
- override addMany(keysOrNodes: (BTNKey | null)[] | (N | null)[], data?: V[]): (N | null | undefined)[] {
196
- const inserted: (N | null | undefined)[] = [];
196
+ override addMany(keysOrNodes: (BTNKey | undefined)[] | (N | undefined)[], data?: V[]): (N | undefined)[] {
197
+ const inserted: (N | undefined | undefined)[] = [];
197
198
 
198
199
  for (let i = 0; i < keysOrNodes.length; i++) {
199
200
  const keyOrNode = keysOrNodes[i];
200
201
 
201
- if (keyOrNode instanceof TreeMultisetNode) {
202
+ if (keyOrNode instanceof TreeMultimapNode) {
202
203
  inserted.push(this.add(keyOrNode.key, keyOrNode.value, keyOrNode.count));
203
204
  continue;
204
205
  }
205
206
 
206
- if (keyOrNode === null) {
207
+ if (keyOrNode === undefined) {
207
208
  inserted.push(this.add(NaN, undefined, 0));
208
209
  continue;
209
210
  }
@@ -283,11 +284,11 @@ export class TreeMultiset<V = any, N extends TreeMultisetNode<V, N> = TreeMultis
283
284
  const bstDeletedResult: BinaryTreeDeletedResult<N>[] = [];
284
285
  if (!this.root) return bstDeletedResult;
285
286
 
286
- const curr: N | null = this.getNode(identifier, callback);
287
+ const curr: N | undefined = this.getNode(identifier, callback) ?? undefined;
287
288
  if (!curr) return bstDeletedResult;
288
289
 
289
- const parent: N | null = curr?.parent ? curr.parent : null;
290
- let needBalanced: N | null = null,
290
+ const parent: N | undefined = curr?.parent ? curr.parent : undefined;
291
+ let needBalanced: N | undefined = undefined,
291
292
  orgCurrent = curr;
292
293
 
293
294
  if (curr.count > 1 && !ignoreCount) {
@@ -307,7 +308,7 @@ export class TreeMultiset<V = any, N extends TreeMultisetNode<V, N> = TreeMultis
307
308
  needBalanced = parent;
308
309
  }
309
310
  } else {
310
- const leftSubTreeRightMost = curr.left ? this.getRightMost(curr.left) : null;
311
+ const leftSubTreeRightMost = curr.left ? this.getRightMost(curr.left) : undefined;
311
312
  if (leftSubTreeRightMost) {
312
313
  const parentOfLeftSubTreeMax = leftSubTreeRightMost.parent;
313
314
  orgCurrent = this._swap(curr, leftSubTreeRightMost);
@@ -24,7 +24,7 @@ export enum FamilyPosition {
24
24
 
25
25
  export type BTNKey = number;
26
26
 
27
- export type BinaryTreeDeletedResult<N> = { deleted: N | null | undefined; needBalanced: N | null };
27
+ export type BinaryTreeDeletedResult<N> = { deleted: N | null | undefined; needBalanced: N | null | undefined };
28
28
 
29
29
  export type BinaryTreeNodeNested<T> = BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
30
30
 
@@ -2,5 +2,5 @@ export * from './binary-tree';
2
2
  export * from './bst';
3
3
  export * from './avl-tree';
4
4
  export * from './segment-tree';
5
- export * from './tree-multiset';
5
+ export * from './tree-multimap';
6
6
  export * from './rb-tree';
@@ -1,8 +1,8 @@
1
- // import {BinaryTreeOptions} from './binary-tree';
2
- // import {RBTreeNode} from '../../../data-structures';
1
+ import {RBTreeNode} from '../../../data-structures';
2
+ import {BSTOptions} from "./bst";
3
3
 
4
4
  export enum RBTNColor { RED = 1, BLACK = 0}
5
5
 
6
- // export type RBTreeNodeNested<T> = RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
7
- //
8
- // export type RBTreeOptions = BinaryTreeOptions & {}
6
+ export type RBTreeNodeNested<T> = RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, RBTreeNode<T, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
7
+
8
+ export type RBTreeOptions = BSTOptions & {};
@@ -0,0 +1,6 @@
1
+ import {TreeMultimapNode} from '../../../data-structures';
2
+ import {AVLTreeOptions} from './avl-tree';
3
+
4
+ export type TreeMultimapNodeNested<T> = TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, TreeMultimapNode<T, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
5
+
6
+ export type TreeMultimapOptions = Omit<AVLTreeOptions, 'isMergeDuplicatedNodeByKey'> & {}
@@ -14,12 +14,12 @@ suite
14
14
  rbTree.add(arr[i]);
15
15
  }
16
16
  })
17
- .add(`${HUNDRED_THOUSAND.toLocaleString()} add & 1000 delete randomly`, () => {
17
+ .add(`${HUNDRED_THOUSAND.toLocaleString()} add & delete randomly`, () => {
18
18
  rbTree.clear();
19
19
  for (let i = 0; i < arr.length; i++) {
20
20
  rbTree.add(arr[i]);
21
21
  }
22
- for (let i = 0; i < 1000; i++) {
22
+ for (let i = 0; i < arr.length; i++) {
23
23
  rbTree.delete(arr[i]);
24
24
  }
25
25
  })
@@ -36,7 +36,6 @@ describe('AVL Tree Test', () => {
36
36
  const dfs = tree.dfs(node => node, 'in');
37
37
  expect(dfs[0].key).toBe(1);
38
38
  expect(dfs[dfs.length - 1].key).toBe(16);
39
-
40
39
  tree.perfectlyBalance();
41
40
  const bfs = tree.bfs(node => node);
42
41
  expect(tree.isPerfectlyBalanced()).toBe(true);
@@ -266,4 +265,24 @@ describe('AVLTree', () => {
266
265
 
267
266
  // You can add more specific assertions to check the tree's balance and structure.
268
267
  });
268
+
269
+ describe('BinaryTree APIs test', () => {
270
+ const avl = new AVLTree<{id: number; text: string}>();
271
+ beforeEach(() => {
272
+ avl.clear();
273
+ });
274
+
275
+ it('add', () => {
276
+ avl.add(1);
277
+ const node2 = new AVLTreeNode(2);
278
+ avl.add(node2);
279
+ const node3 = new AVLTreeNode(3, {id: 3, text: 'text3'});
280
+ avl.add(node3);
281
+ avl.add(node3, {id: 3, text: 'text33'});
282
+
283
+ const bfsRes = avl.bfs(node => node);
284
+ expect(bfsRes[0]?.key).toBe(2);
285
+ });
286
+ });
287
+
269
288
  });
@@ -1,4 +1,4 @@
1
- import {AVLTree, AVLTreeNode, BinaryTree, BinaryTreeNode, IterationType} from '../../../../src';
1
+ import {BinaryTree, BinaryTreeNode, IterationType} from '../../../../src';
2
2
  // import {isDebugTest} from '../../../config';
3
3
 
4
4
  // const isDebug = isDebugTest;
@@ -177,10 +177,10 @@ describe('BinaryTree', () => {
177
177
  expect(tree.subTreeTraverse(node => node.key, tree.getNode(6), IterationType.ITERATIVE)).toEqual([6, 3, 7]);
178
178
  expect(tree.subTreeTraverse(node => node.key, tree.getNode(6), IterationType.RECURSIVE)).toEqual([6, 3, 7]);
179
179
  expect(
180
- tree.subTreeTraverse(node => (node === null ? null : node.key), tree.getNode(6), IterationType.ITERATIVE, true)
180
+ tree.subTreeTraverse(node => (node ? node.key : null ), tree.getNode(6), IterationType.ITERATIVE, true)
181
181
  ).toEqual([6, 3, 7, null]);
182
182
  expect(
183
- tree.subTreeTraverse(node => (node === null ? null : node.key), tree.getNode(6), IterationType.RECURSIVE, true)
183
+ tree.subTreeTraverse(node => (node ? node.key : null ), tree.getNode(6), IterationType.RECURSIVE, true)
184
184
  ).toEqual([6, 3, 7, null]);
185
185
  });
186
186
 
@@ -193,7 +193,7 @@ describe('BinaryTree', () => {
193
193
  tree.clear();
194
194
 
195
195
  expect(tree.size).toBe(0);
196
- expect(tree.root).toBeNull();
196
+ expect(tree.root).toBeUndefined();
197
197
  });
198
198
  });
199
199
 
@@ -248,35 +248,16 @@ describe('BinaryTree Morris Traversal', () => {
248
248
  });
249
249
  });
250
250
 
251
- describe('BinaryTree APIs test', () => {
252
- const avl = new AVLTree<{id: number; text: string}>();
253
- beforeEach(() => {
254
- avl.clear();
255
- });
256
-
257
- it('add', () => {
258
- avl.add(1);
259
- const node2 = new AVLTreeNode(2);
260
- avl.add(node2);
261
- const node3 = new AVLTreeNode(3, {id: 3, text: 'text3'});
262
- avl.add(node3);
263
- avl.add(node3, {id: 3, text: 'text33'});
264
-
265
- const bfsRes = avl.bfs(node => node);
266
- expect(bfsRes[0]?.key).toBe(2);
267
- });
268
- });
269
-
270
251
  describe('BinaryTree traversals', () => {
271
252
  const tree = new BinaryTree<number>();
272
253
 
273
254
  const arr = [35, 20, 40, 15, 29, null, 50, null, 16, 28, 30, 45, 55];
274
255
  tree.refill(arr);
275
256
  expect(
276
- tree.bfs(node => node, tree.root, IterationType.ITERATIVE, true).map(node => (node === null ? null : node.key))
257
+ tree.bfs(node => node, tree.root, IterationType.ITERATIVE, true).map(node => (node ? node.key : null ))
277
258
  ).toEqual([35, 20, 40, 15, 29, null, 50, null, 16, 28, 30, 45, 55]);
278
259
  expect(
279
- tree.bfs(node => node, tree.root, IterationType.RECURSIVE, true).map(node => (node === null ? null : node.key))
260
+ tree.bfs(node => node, tree.root, IterationType.RECURSIVE, true).map(node => (node ? node.key : null ))
280
261
  ).toEqual([35, 20, 40, 15, 29, null, 50, null, 16, 28, 30, 45, 55]);
281
262
  expect(
282
263
  tree.bfs(node => node, tree.root, IterationType.ITERATIVE).map(node => (node === null ? null : node.key))
@@ -292,12 +273,12 @@ describe('BinaryTree traversals', () => {
292
273
  expect(
293
274
  tree
294
275
  .dfs(node => node, 'pre', tree.root, IterationType.ITERATIVE, true)
295
- .map(node => (node === null ? null : node.key))
276
+ .map(node => (node ? node.key : null ))
296
277
  ).toEqual([35, 20, 15, null, 16, 29, 28, 30, 40, null, 50, 45, 55]);
297
278
  expect(
298
279
  tree
299
280
  .dfs(node => node, 'pre', tree.root, IterationType.RECURSIVE, true)
300
- .map(node => (node === null ? null : node.key))
281
+ .map(node => (node ? node.key : null ))
301
282
  ).toEqual([35, 20, 15, null, 16, 29, 28, 30, 40, null, 50, 45, 55]);
302
283
 
303
284
  expect(tree.dfs(node => node.key, 'in')).toEqual([15, 16, 20, 28, 29, 30, 35, 40, 45, 50, 55]);
@@ -320,13 +301,13 @@ describe('BinaryTree traversals', () => {
320
301
  [15, 29, 50],
321
302
  [16, 28, 30, 45, 55]
322
303
  ]);
323
- expect(tree.listLevels(node => (node === null ? null : node.key), tree.root, IterationType.ITERATIVE, true)).toEqual([
304
+ expect(tree.listLevels(node => (node ? node.key : null ), tree.root, IterationType.ITERATIVE, true)).toEqual([
324
305
  [35],
325
306
  [20, 40],
326
307
  [15, 29, null, 50],
327
308
  [null, 16, 28, 30, 45, 55]
328
309
  ]);
329
- expect(tree.listLevels(node => (node === null ? null : node.key), tree.root, IterationType.RECURSIVE, true)).toEqual([
310
+ expect(tree.listLevels(node => ( node ? node.key : null ), tree.root, IterationType.RECURSIVE, true)).toEqual([
330
311
  [35],
331
312
  [20, 40],
332
313
  [15, 29, null, 50],
@@ -348,7 +329,7 @@ describe('BinaryTree', () => {
348
329
  it('should create an empty BinaryTree', () => {
349
330
  expect(tree.size).toBe(0);
350
331
  expect(tree.isEmpty()).toBe(true);
351
- expect(tree.root).toBe(null);
332
+ expect(tree.root).toBe(undefined);
352
333
  });
353
334
 
354
335
  it('should add nodes to the tree', () => {
@@ -370,7 +351,7 @@ describe('BinaryTree', () => {
370
351
 
371
352
  expect(tree.size).toBe(0);
372
353
  expect(tree.isEmpty()).toBe(true);
373
- expect(tree.root).toBe(null);
354
+ expect(tree.root).toBe(undefined);
374
355
  });
375
356
 
376
357
  it('should get nodes by key', () => {
@@ -840,14 +840,14 @@ describe('BST Performance test', function () {
840
840
 
841
841
  it('should subTreeTraverse, null should be ignored', () => {
842
842
  const bst = new BST();
843
- bst.addMany([4, 2, 6, null, 1, 3, null, 5, null, 7]);
843
+ bst.addMany([4, 2, 6, 1, 3, 5, 7]);
844
844
  expect(bst.subTreeTraverse(node => node.key, bst.getNode(6), IterationType.ITERATIVE)).toEqual([6, 5, 7]);
845
845
  expect(bst.subTreeTraverse(node => node.key, bst.getNode(6), IterationType.RECURSIVE)).toEqual([6, 5, 7]);
846
846
  expect(
847
- bst.subTreeTraverse(node => (node === null ? null : node.key), bst.getNode(6), IterationType.ITERATIVE, true)
847
+ bst.subTreeTraverse(node => (node?.key ?? undefined), bst.getNode(6), IterationType.ITERATIVE, true)
848
848
  ).toEqual([6, 5, 7]);
849
849
  expect(
850
- bst.subTreeTraverse(node => (node === null ? null : node.key), bst.getNode(6), IterationType.RECURSIVE, true)
850
+ bst.subTreeTraverse(node => (node?.key ?? undefined), bst.getNode(6), IterationType.RECURSIVE, true)
851
851
  ).toEqual([6, 5, 7]);
852
852
  });
853
853
  });