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.
- package/CHANGELOG.md +1 -1
- package/README.md +17 -17
- package/benchmark/report.html +12 -12
- package/benchmark/report.json +106 -106
- package/dist/cjs/src/data-structures/binary-tree/avl-tree.d.ts +2 -2
- package/dist/cjs/src/data-structures/binary-tree/avl-tree.js +5 -3
- package/dist/cjs/src/data-structures/binary-tree/avl-tree.js.map +1 -1
- package/dist/cjs/src/data-structures/binary-tree/binary-tree.d.ts +56 -52
- package/dist/cjs/src/data-structures/binary-tree/binary-tree.js +115 -53
- package/dist/cjs/src/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/cjs/src/data-structures/binary-tree/bst.d.ts +42 -15
- package/dist/cjs/src/data-structures/binary-tree/bst.js +77 -21
- package/dist/cjs/src/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/cjs/src/data-structures/binary-tree/index.d.ts +1 -1
- package/dist/cjs/src/data-structures/binary-tree/index.js +1 -1
- package/dist/cjs/src/data-structures/binary-tree/rb-tree.d.ts +28 -51
- package/dist/cjs/src/data-structures/binary-tree/rb-tree.js +148 -180
- package/dist/cjs/src/data-structures/binary-tree/rb-tree.js.map +1 -1
- package/dist/cjs/src/data-structures/binary-tree/{tree-multiset.d.ts → tree-multimap.d.ts} +20 -20
- package/dist/cjs/src/data-structures/binary-tree/{tree-multiset.js → tree-multimap.js} +35 -32
- package/dist/cjs/src/data-structures/binary-tree/tree-multimap.js.map +1 -0
- package/dist/cjs/src/types/data-structures/binary-tree/binary-tree.d.ts +1 -1
- package/dist/cjs/src/types/data-structures/binary-tree/index.d.ts +1 -1
- package/dist/cjs/src/types/data-structures/binary-tree/index.js +1 -1
- package/dist/cjs/src/types/data-structures/binary-tree/rb-tree.d.ts +4 -0
- package/dist/cjs/src/types/data-structures/binary-tree/rb-tree.js +0 -5
- package/dist/cjs/src/types/data-structures/binary-tree/rb-tree.js.map +1 -1
- package/dist/cjs/src/types/data-structures/binary-tree/tree-multimap.d.ts +4 -0
- package/dist/cjs/src/types/data-structures/binary-tree/{tree-multiset.js → tree-multimap.js} +1 -1
- package/dist/cjs/src/types/data-structures/binary-tree/tree-multimap.js.map +1 -0
- package/dist/mjs/src/data-structures/binary-tree/avl-tree.d.ts +2 -2
- package/dist/mjs/src/data-structures/binary-tree/avl-tree.js +5 -3
- package/dist/mjs/src/data-structures/binary-tree/binary-tree.d.ts +56 -52
- package/dist/mjs/src/data-structures/binary-tree/binary-tree.js +115 -53
- package/dist/mjs/src/data-structures/binary-tree/bst.d.ts +42 -15
- package/dist/mjs/src/data-structures/binary-tree/bst.js +79 -21
- package/dist/mjs/src/data-structures/binary-tree/index.d.ts +1 -1
- package/dist/mjs/src/data-structures/binary-tree/index.js +1 -1
- package/dist/mjs/src/data-structures/binary-tree/rb-tree.d.ts +28 -51
- package/dist/mjs/src/data-structures/binary-tree/rb-tree.js +148 -184
- package/dist/mjs/src/data-structures/binary-tree/{tree-multiset.d.ts → tree-multimap.d.ts} +20 -20
- package/dist/mjs/src/data-structures/binary-tree/{tree-multiset.js → tree-multimap.js} +33 -31
- package/dist/mjs/src/types/data-structures/binary-tree/binary-tree.d.ts +1 -1
- package/dist/mjs/src/types/data-structures/binary-tree/index.d.ts +1 -1
- package/dist/mjs/src/types/data-structures/binary-tree/index.js +1 -1
- package/dist/mjs/src/types/data-structures/binary-tree/rb-tree.d.ts +4 -0
- package/dist/mjs/src/types/data-structures/binary-tree/rb-tree.js +0 -5
- package/dist/mjs/src/types/data-structures/binary-tree/tree-multimap.d.ts +4 -0
- package/dist/umd/data-structure-typed.min.js +1 -1
- package/dist/umd/data-structure-typed.min.js.map +1 -1
- package/package.json +5 -3
- package/src/data-structures/binary-tree/avl-tree.ts +5 -4
- package/src/data-structures/binary-tree/binary-tree.ts +201 -131
- package/src/data-structures/binary-tree/bst.ts +100 -34
- package/src/data-structures/binary-tree/index.ts +1 -1
- package/src/data-structures/binary-tree/rb-tree.ts +227 -236
- package/src/data-structures/binary-tree/{tree-multiset.ts → tree-multimap.ts} +38 -37
- package/src/types/data-structures/binary-tree/binary-tree.ts +1 -1
- package/src/types/data-structures/binary-tree/index.ts +1 -1
- package/src/types/data-structures/binary-tree/rb-tree.ts +5 -5
- package/src/types/data-structures/binary-tree/tree-multimap.ts +6 -0
- package/test/performance/data-structures/binary-tree/rb-tree.test.ts +2 -2
- package/test/unit/data-structures/binary-tree/avl-tree.test.ts +20 -1
- package/test/unit/data-structures/binary-tree/binary-tree.test.ts +12 -31
- package/test/unit/data-structures/binary-tree/bst.test.ts +3 -3
- package/test/unit/data-structures/binary-tree/rb-tree.test.ts +205 -159
- package/test/unit/data-structures/binary-tree/{tree-multiset.test.ts → tree-multimap.test.ts} +182 -182
- package/dist/cjs/src/data-structures/binary-tree/tree-multiset.js.map +0 -1
- package/dist/cjs/src/types/data-structures/binary-tree/tree-multiset.d.ts +0 -4
- package/dist/cjs/src/types/data-structures/binary-tree/tree-multiset.js.map +0 -1
- package/dist/mjs/src/types/data-structures/binary-tree/tree-multiset.d.ts +0 -4
- package/src/types/data-structures/binary-tree/tree-multiset.ts +0 -6
- /package/dist/mjs/src/types/data-structures/binary-tree/{tree-multiset.js → tree-multimap.js} +0 -0
- /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,
|
|
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
|
|
13
|
+
export class TreeMultimapNode<
|
|
14
14
|
V = any,
|
|
15
|
-
N extends
|
|
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
|
|
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
|
|
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
|
|
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 {
|
|
46
|
-
*
|
|
45
|
+
* @param {TreeMultimapOptions} [options] - An optional object that contains additional configuration options for the
|
|
46
|
+
* TreeMultimap.
|
|
47
47
|
*/
|
|
48
|
-
constructor(options?:
|
|
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
|
|
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 |
|
|
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 `
|
|
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 |
|
|
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 |
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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 ===
|
|
90
|
-
newNode =
|
|
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
|
|
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 |
|
|
155
|
-
* the tree. It can be either a node object (`N`) or `
|
|
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 |
|
|
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 !==
|
|
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 !==
|
|
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
|
|
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 |
|
|
189
|
-
* added to the multiset. Each element can be either a BTNKey or a
|
|
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`, `
|
|
194
|
+
* @returns The function `addMany` returns an array of `N`, `undefined`, or `undefined` values.
|
|
194
195
|
*/
|
|
195
|
-
override addMany(keysOrNodes: (BTNKey |
|
|
196
|
-
const inserted: (N |
|
|
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
|
|
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 ===
|
|
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 |
|
|
287
|
+
const curr: N | undefined = this.getNode(identifier, callback) ?? undefined;
|
|
287
288
|
if (!curr) return bstDeletedResult;
|
|
288
289
|
|
|
289
|
-
const parent: N |
|
|
290
|
-
let needBalanced: N |
|
|
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) :
|
|
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
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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 &
|
|
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 <
|
|
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 {
|
|
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
|
|
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
|
|
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).
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
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(
|
|
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,
|
|
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
|
|
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
|
|
850
|
+
bst.subTreeTraverse(node => (node?.key ?? undefined), bst.getNode(6), IterationType.RECURSIVE, true)
|
|
851
851
|
).toEqual([6, 5, 7]);
|
|
852
852
|
});
|
|
853
853
|
});
|