min-heap-typed 1.39.2 → 1.39.3
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/dist/data-structures/binary-tree/avl-tree.d.ts +10 -10
- package/dist/data-structures/binary-tree/avl-tree.js +4 -4
- package/dist/data-structures/binary-tree/binary-tree.d.ts +49 -108
- package/dist/data-structures/binary-tree/binary-tree.js +27 -27
- package/dist/data-structures/binary-tree/bst.d.ts +22 -22
- package/dist/data-structures/binary-tree/bst.js +12 -12
- package/dist/data-structures/binary-tree/rb-tree.d.ts +3 -3
- package/dist/data-structures/binary-tree/tree-multiset.d.ts +14 -14
- package/dist/data-structures/binary-tree/tree-multiset.js +7 -7
- package/dist/interfaces/binary-tree.d.ts +4 -4
- package/dist/types/data-structures/binary-tree/binary-tree.d.ts +1 -1
- package/dist/types/data-structures/binary-tree/bst.d.ts +2 -2
- package/dist/types/helpers.d.ts +1 -1
- package/package.json +1 -1
- package/src/data-structures/binary-tree/avl-tree.ts +13 -12
- package/src/data-structures/binary-tree/binary-indexed-tree.ts +1 -1
- package/src/data-structures/binary-tree/binary-tree.ts +130 -60
- package/src/data-structures/binary-tree/bst.ts +31 -32
- package/src/data-structures/binary-tree/rb-tree.ts +7 -6
- package/src/data-structures/binary-tree/tree-multiset.ts +16 -15
- package/src/data-structures/graph/abstract-graph.ts +11 -10
- package/src/data-structures/graph/directed-graph.ts +2 -1
- package/src/data-structures/graph/undirected-graph.ts +5 -4
- package/src/data-structures/hash/hash-map.ts +1 -1
- package/src/data-structures/hash/tree-map.ts +1 -2
- package/src/data-structures/hash/tree-set.ts +1 -2
- package/src/data-structures/heap/heap.ts +2 -2
- package/src/data-structures/heap/max-heap.ts +1 -1
- package/src/data-structures/heap/min-heap.ts +1 -1
- package/src/data-structures/linked-list/doubly-linked-list.ts +1 -1
- package/src/data-structures/linked-list/singly-linked-list.ts +1 -1
- package/src/data-structures/matrix/matrix.ts +1 -1
- package/src/data-structures/matrix/vector2d.ts +1 -2
- package/src/data-structures/priority-queue/max-priority-queue.ts +1 -1
- package/src/data-structures/priority-queue/min-priority-queue.ts +1 -1
- package/src/data-structures/priority-queue/priority-queue.ts +1 -1
- package/src/data-structures/queue/deque.ts +4 -5
- package/src/data-structures/queue/queue.ts +1 -1
- package/src/interfaces/binary-tree.ts +4 -4
- package/src/types/data-structures/binary-tree/binary-tree.ts +1 -1
- package/src/types/data-structures/binary-tree/bst.ts +2 -2
- package/src/types/data-structures/matrix/navigator.ts +1 -1
- package/src/types/helpers.ts +1 -1
- package/src/types/utils/utils.ts +1 -1
- package/src/types/utils/validate-type.ts +2 -2
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* @license MIT License
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import type {
|
|
9
|
+
import type {BinaryTreeNodeNested, BinaryTreeOptions, BTNCallback, BTNKey} from '../../types';
|
|
10
10
|
import {BinaryTreeDeletedResult, DFSOrderPattern, FamilyPosition, IterationType} from '../../types';
|
|
11
11
|
import {IBinaryTree} from '../../interfaces';
|
|
12
12
|
import {trampoline} from '../../utils';
|
|
@@ -21,7 +21,7 @@ export class BinaryTreeNode<V = any, N extends BinaryTreeNode<V, N> = BinaryTree
|
|
|
21
21
|
/**
|
|
22
22
|
* The key associated with the node.
|
|
23
23
|
*/
|
|
24
|
-
key:
|
|
24
|
+
key: BTNKey;
|
|
25
25
|
|
|
26
26
|
/**
|
|
27
27
|
* The value stored in the node.
|
|
@@ -35,10 +35,10 @@ export class BinaryTreeNode<V = any, N extends BinaryTreeNode<V, N> = BinaryTree
|
|
|
35
35
|
|
|
36
36
|
/**
|
|
37
37
|
* Creates a new instance of BinaryTreeNode.
|
|
38
|
-
* @param {
|
|
38
|
+
* @param {BTNKey} key - The key associated with the node.
|
|
39
39
|
* @param {V} val - The value stored in the node.
|
|
40
40
|
*/
|
|
41
|
-
constructor(key:
|
|
41
|
+
constructor(key: BTNKey, val?: V) {
|
|
42
42
|
this.key = key;
|
|
43
43
|
this.val = val;
|
|
44
44
|
}
|
|
@@ -108,7 +108,8 @@ export class BinaryTreeNode<V = any, N extends BinaryTreeNode<V, N> = BinaryTree
|
|
|
108
108
|
* @template N - The type of the binary tree's nodes.
|
|
109
109
|
*/
|
|
110
110
|
export class BinaryTree<V = any, N extends BinaryTreeNode<V, N> = BinaryTreeNode<V, BinaryTreeNodeNested<V>>>
|
|
111
|
-
implements IBinaryTree<V, N>
|
|
111
|
+
implements IBinaryTree<V, N>
|
|
112
|
+
{
|
|
112
113
|
/**
|
|
113
114
|
* Creates a new instance of BinaryTree.
|
|
114
115
|
* @param {BinaryTreeOptions} [options] - The options for the binary tree.
|
|
@@ -157,11 +158,11 @@ export class BinaryTree<V = any, N extends BinaryTreeNode<V, N> = BinaryTreeNode
|
|
|
157
158
|
|
|
158
159
|
/**
|
|
159
160
|
* Creates a new instance of BinaryTreeNode with the given key and value.
|
|
160
|
-
* @param {
|
|
161
|
+
* @param {BTNKey} key - The key for the new node.
|
|
161
162
|
* @param {V} val - The value for the new node.
|
|
162
163
|
* @returns {N} - The newly created BinaryTreeNode.
|
|
163
164
|
*/
|
|
164
|
-
createNode(key:
|
|
165
|
+
createNode(key: BTNKey, val?: V): N {
|
|
165
166
|
return new BinaryTreeNode<V, N>(key, val) as N;
|
|
166
167
|
}
|
|
167
168
|
|
|
@@ -183,11 +184,11 @@ export class BinaryTree<V = any, N extends BinaryTreeNode<V, N> = BinaryTreeNode
|
|
|
183
184
|
|
|
184
185
|
/**
|
|
185
186
|
* Add a node with the given key and value to the binary tree.
|
|
186
|
-
* @param {
|
|
187
|
+
* @param {BTNKey | N | null} keyOrNode - The key or node to add to the binary tree.
|
|
187
188
|
* @param {V} val - The value for the new node (optional).
|
|
188
189
|
* @returns {N | null | undefined} - The inserted node, or null if nothing was inserted, or undefined if the operation failed.
|
|
189
190
|
*/
|
|
190
|
-
add(keyOrNode:
|
|
191
|
+
add(keyOrNode: BTNKey | N | null, val?: V): N | null | undefined {
|
|
191
192
|
const _bfs = (root: N, newNode: N | null): N | undefined | null => {
|
|
192
193
|
const queue = new Queue<N | null>([root]);
|
|
193
194
|
while (queue.size > 0) {
|
|
@@ -240,14 +241,14 @@ export class BinaryTree<V = any, N extends BinaryTreeNode<V, N> = BinaryTreeNode
|
|
|
240
241
|
/**
|
|
241
242
|
* The `addMany` function takes an array of binary tree node IDs or nodes, and optionally an array of corresponding data
|
|
242
243
|
* values, and adds them to the binary tree.
|
|
243
|
-
* @param {(
|
|
244
|
+
* @param {(BTNKey | null)[] | (N | null)[]} keysOrNodes - An array of BTNKey or BinaryTreeNode
|
|
244
245
|
* objects, or null values.
|
|
245
246
|
* @param {V[]} [values] - The `values` parameter is an optional array of values (`V[]`) that corresponds to
|
|
246
247
|
* the nodes or node IDs being added. It is used to set the value of each node being added. If `values` is not provided,
|
|
247
248
|
* the value of the nodes will be `undefined`.
|
|
248
249
|
* @returns The function `addMany` returns an array of `N`, `null`, or `undefined` values.
|
|
249
250
|
*/
|
|
250
|
-
addMany(keysOrNodes: (
|
|
251
|
+
addMany(keysOrNodes: (BTNKey | null)[] | (N | null)[], values?: V[]): (N | null | undefined)[] {
|
|
251
252
|
// TODO not sure addMany not be run multi times
|
|
252
253
|
return keysOrNodes.map((keyOrNode, i) => {
|
|
253
254
|
if (keyOrNode instanceof BinaryTreeNode) {
|
|
@@ -265,33 +266,39 @@ export class BinaryTree<V = any, N extends BinaryTreeNode<V, N> = BinaryTreeNode
|
|
|
265
266
|
|
|
266
267
|
/**
|
|
267
268
|
* The `refill` function clears the binary tree and adds multiple nodes with the given IDs or nodes and optional data.
|
|
268
|
-
* @param {(
|
|
269
|
-
* `
|
|
269
|
+
* @param {(BTNKey | N)[]} keysOrNodes - The `keysOrNodes` parameter is an array that can contain either
|
|
270
|
+
* `BTNKey` or `N` values.
|
|
270
271
|
* @param {N[] | Array<V>} [data] - The `data` parameter is an optional array of values that will be assigned to
|
|
271
272
|
* the nodes being added. If provided, the length of the `data` array should be equal to the length of the `keysOrNodes`
|
|
272
273
|
* array. Each value in the `data` array will be assigned to the
|
|
273
274
|
* @returns The method is returning a boolean value.
|
|
274
275
|
*/
|
|
275
|
-
refill(keysOrNodes: (
|
|
276
|
+
refill(keysOrNodes: (BTNKey | null)[] | (N | null)[], data?: Array<V>): boolean {
|
|
276
277
|
this.clear();
|
|
277
278
|
return keysOrNodes.length === this.addMany(keysOrNodes, data).length;
|
|
278
279
|
}
|
|
279
280
|
|
|
281
|
+
delete<C extends BTNCallback<N, BTNKey>>(identifier: BTNKey, callback?: C): BinaryTreeDeletedResult<N>[];
|
|
282
|
+
|
|
283
|
+
delete<C extends BTNCallback<N, N>>(identifier: N | null, callback?: C): BinaryTreeDeletedResult<N>[];
|
|
284
|
+
|
|
285
|
+
delete<C extends BTNCallback<N>>(identifier: ReturnType<C>, callback: C): BinaryTreeDeletedResult<N>[];
|
|
286
|
+
|
|
280
287
|
/**
|
|
281
288
|
* The `delete` function removes a node from a binary search tree and returns the deleted node along
|
|
282
289
|
* with the parent node that needs to be balanced.
|
|
283
|
-
* a key (`
|
|
290
|
+
* a key (`BTNKey`). If it is a key, the function will find the corresponding node in the
|
|
284
291
|
* binary tree.
|
|
285
292
|
* @returns an array of `BinaryTreeDeletedResult<N>` objects.
|
|
286
293
|
* @param {ReturnType<C>} identifier - The `identifier` parameter is either a
|
|
287
|
-
* `
|
|
294
|
+
* `BTNKey` or a generic type `N`. It represents the property of the node that we are
|
|
288
295
|
* searching for. It can be a specific key value or any other property of the node.
|
|
289
296
|
* @param callback - The `callback` parameter is a function that takes a node as input and returns a
|
|
290
297
|
* value. This value is compared with the `identifier` parameter to determine if the node should be
|
|
291
298
|
* included in the result. The `callback` parameter has a default value of
|
|
292
299
|
* `this._defaultCallbackByKey`, which
|
|
293
300
|
*/
|
|
294
|
-
delete<C extends
|
|
301
|
+
delete<C extends BTNCallback<N>>(
|
|
295
302
|
identifier: ReturnType<C> | null,
|
|
296
303
|
callback: C = this._defaultCallbackByKey as C
|
|
297
304
|
): BinaryTreeDeletedResult<N>[] {
|
|
@@ -341,16 +348,16 @@ export class BinaryTree<V = any, N extends BinaryTreeNode<V, N> = BinaryTreeNode
|
|
|
341
348
|
/**
|
|
342
349
|
* The function `getDepth` calculates the depth of a given node in a binary tree relative to a
|
|
343
350
|
* specified root node.
|
|
344
|
-
* @param {
|
|
351
|
+
* @param {BTNKey | N | null} distNode - The `distNode` parameter represents the node
|
|
345
352
|
* whose depth we want to find in the binary tree. It can be either a node object (`N`), a key value
|
|
346
|
-
* of the node (`
|
|
347
|
-
* @param {
|
|
353
|
+
* of the node (`BTNKey`), or `null`.
|
|
354
|
+
* @param {BTNKey | N | null} beginRoot - The `beginRoot` parameter represents the
|
|
348
355
|
* starting node from which we want to calculate the depth. It can be either a node object or the key
|
|
349
356
|
* of a node in the binary tree. If no value is provided for `beginRoot`, it defaults to the root
|
|
350
357
|
* node of the binary tree.
|
|
351
358
|
* @returns the depth of the `distNode` relative to the `beginRoot`.
|
|
352
359
|
*/
|
|
353
|
-
getDepth(distNode:
|
|
360
|
+
getDepth(distNode: BTNKey | N | null, beginRoot: BTNKey | N | null = this.root): number {
|
|
354
361
|
if (typeof distNode === 'number') distNode = this.get(distNode);
|
|
355
362
|
if (typeof beginRoot === 'number') beginRoot = this.get(beginRoot);
|
|
356
363
|
let depth = 0;
|
|
@@ -367,16 +374,16 @@ export class BinaryTree<V = any, N extends BinaryTreeNode<V, N> = BinaryTreeNode
|
|
|
367
374
|
/**
|
|
368
375
|
* The `getHeight` function calculates the maximum height of a binary tree using either recursive or
|
|
369
376
|
* iterative approach.
|
|
370
|
-
* @param {
|
|
377
|
+
* @param {BTNKey | N | null} beginRoot - The `beginRoot` parameter represents the
|
|
371
378
|
* starting node from which the height of the binary tree is calculated. It can be either a node
|
|
372
|
-
* object (`N`), a key value of a node in the tree (`
|
|
379
|
+
* object (`N`), a key value of a node in the tree (`BTNKey`), or `null` if no starting
|
|
373
380
|
* node is specified. If `
|
|
374
381
|
* @param iterationType - The `iterationType` parameter is used to determine whether to calculate the
|
|
375
382
|
* height of the binary tree using a recursive approach or an iterative approach. It can have two
|
|
376
383
|
* possible values:
|
|
377
384
|
* @returns the height of the binary tree.
|
|
378
385
|
*/
|
|
379
|
-
getHeight(beginRoot:
|
|
386
|
+
getHeight(beginRoot: BTNKey | N | null = this.root, iterationType = this.iterationType): number {
|
|
380
387
|
if (typeof beginRoot === 'number') beginRoot = this.get(beginRoot);
|
|
381
388
|
if (!beginRoot) return -1;
|
|
382
389
|
|
|
@@ -394,7 +401,7 @@ export class BinaryTree<V = any, N extends BinaryTreeNode<V, N> = BinaryTreeNode
|
|
|
394
401
|
return -1;
|
|
395
402
|
}
|
|
396
403
|
|
|
397
|
-
const stack: {
|
|
404
|
+
const stack: {node: N; depth: number}[] = [{node: beginRoot, depth: 0}];
|
|
398
405
|
let maxHeight = 0;
|
|
399
406
|
|
|
400
407
|
while (stack.length > 0) {
|
|
@@ -478,11 +485,35 @@ export class BinaryTree<V = any, N extends BinaryTreeNode<V, N> = BinaryTreeNode
|
|
|
478
485
|
return this.getMinHeight(beginRoot) + 1 >= this.getHeight(beginRoot);
|
|
479
486
|
}
|
|
480
487
|
|
|
488
|
+
getNodes<C extends BTNCallback<N, BTNKey>>(
|
|
489
|
+
identifier: BTNKey,
|
|
490
|
+
callback: C,
|
|
491
|
+
onlyOne?: boolean,
|
|
492
|
+
beginRoot?: N | null,
|
|
493
|
+
iterationType?: IterationType
|
|
494
|
+
): N[];
|
|
495
|
+
|
|
496
|
+
getNodes<C extends BTNCallback<N, N>>(
|
|
497
|
+
identifier: N | null,
|
|
498
|
+
callback: C,
|
|
499
|
+
onlyOne?: boolean,
|
|
500
|
+
beginRoot?: N | null,
|
|
501
|
+
iterationType?: IterationType
|
|
502
|
+
): N[];
|
|
503
|
+
|
|
504
|
+
getNodes<C extends BTNCallback<N>>(
|
|
505
|
+
identifier: ReturnType<C>,
|
|
506
|
+
callback: C,
|
|
507
|
+
onlyOne?: boolean,
|
|
508
|
+
beginRoot?: N | null,
|
|
509
|
+
iterationType?: IterationType
|
|
510
|
+
): N[];
|
|
511
|
+
|
|
481
512
|
/**
|
|
482
513
|
* The function `getNodes` returns an array of nodes that match a given node property, using either
|
|
483
514
|
* recursive or iterative traversal.
|
|
484
515
|
* @param {ReturnType<C>} identifier - The `identifier` parameter is either a
|
|
485
|
-
* `
|
|
516
|
+
* `BTNKey` or a generic type `N`. It represents the property of the node that we are
|
|
486
517
|
* searching for. It can be a specific key value or any other property of the node.
|
|
487
518
|
* @param callback - The `callback` parameter is a function that takes a node as input and returns a
|
|
488
519
|
* value. This value is compared with the `identifier` parameter to determine if the node should be
|
|
@@ -499,7 +530,7 @@ export class BinaryTree<V = any, N extends BinaryTreeNode<V, N> = BinaryTreeNode
|
|
|
499
530
|
* traverse the binary tree. It can have two possible values:
|
|
500
531
|
* @returns The function `getNodes` returns an array of nodes (`N[]`).
|
|
501
532
|
*/
|
|
502
|
-
getNodes<C extends
|
|
533
|
+
getNodes<C extends BTNCallback<N>>(
|
|
503
534
|
identifier: ReturnType<C> | null,
|
|
504
535
|
callback: C = this._defaultCallbackByKey as C,
|
|
505
536
|
onlyOne = false,
|
|
@@ -540,10 +571,31 @@ export class BinaryTree<V = any, N extends BinaryTreeNode<V, N> = BinaryTreeNode
|
|
|
540
571
|
return ans;
|
|
541
572
|
}
|
|
542
573
|
|
|
574
|
+
has<C extends BTNCallback<N, BTNKey>>(
|
|
575
|
+
identifier: BTNKey,
|
|
576
|
+
callback?: C,
|
|
577
|
+
beginRoot?: N,
|
|
578
|
+
iterationType?: IterationType
|
|
579
|
+
): boolean;
|
|
580
|
+
|
|
581
|
+
has<C extends BTNCallback<N, N>>(
|
|
582
|
+
identifier: N | null,
|
|
583
|
+
callback?: C,
|
|
584
|
+
beginRoot?: N,
|
|
585
|
+
iterationType?: IterationType
|
|
586
|
+
): boolean;
|
|
587
|
+
|
|
588
|
+
has<C extends BTNCallback<N>>(
|
|
589
|
+
identifier: ReturnType<C> | null,
|
|
590
|
+
callback: C,
|
|
591
|
+
beginRoot?: N,
|
|
592
|
+
iterationType?: IterationType
|
|
593
|
+
): boolean;
|
|
594
|
+
|
|
543
595
|
/**
|
|
544
596
|
* The function checks if a binary tree has a node with a given property or key.
|
|
545
|
-
* @param {
|
|
546
|
-
* the node that you want to find in the binary tree. It can be either a `
|
|
597
|
+
* @param {BTNKey | N} identifier - The `identifier` parameter is the key or value of
|
|
598
|
+
* the node that you want to find in the binary tree. It can be either a `BTNKey` or a
|
|
547
599
|
* generic type `N`.
|
|
548
600
|
* @param callback - The `callback` parameter is a function that is used to determine whether a node
|
|
549
601
|
* matches the desired criteria. It takes a node as input and returns a boolean value indicating
|
|
@@ -557,7 +609,7 @@ export class BinaryTree<V = any, N extends BinaryTreeNode<V, N> = BinaryTreeNode
|
|
|
557
609
|
* performed when searching for nodes in the binary tree. It can have one of the following values:
|
|
558
610
|
* @returns a boolean value.
|
|
559
611
|
*/
|
|
560
|
-
has<C extends
|
|
612
|
+
has<C extends BTNCallback<N>>(
|
|
561
613
|
identifier: ReturnType<C> | null,
|
|
562
614
|
callback: C = this._defaultCallbackByKey as C,
|
|
563
615
|
beginRoot = this.root,
|
|
@@ -568,10 +620,31 @@ export class BinaryTree<V = any, N extends BinaryTreeNode<V, N> = BinaryTreeNode
|
|
|
568
620
|
return this.getNodes(identifier, callback, true, beginRoot, iterationType).length > 0;
|
|
569
621
|
}
|
|
570
622
|
|
|
623
|
+
get<C extends BTNCallback<N, BTNKey>>(
|
|
624
|
+
identifier: BTNKey,
|
|
625
|
+
callback?: C,
|
|
626
|
+
beginRoot?: N,
|
|
627
|
+
iterationType?: IterationType
|
|
628
|
+
): N | null;
|
|
629
|
+
|
|
630
|
+
get<C extends BTNCallback<N, N>>(
|
|
631
|
+
identifier: N | null,
|
|
632
|
+
callback?: C,
|
|
633
|
+
beginRoot?: N,
|
|
634
|
+
iterationType?: IterationType
|
|
635
|
+
): N | null;
|
|
636
|
+
|
|
637
|
+
get<C extends BTNCallback<N>>(
|
|
638
|
+
identifier: ReturnType<C>,
|
|
639
|
+
callback: C,
|
|
640
|
+
beginRoot?: N,
|
|
641
|
+
iterationType?: IterationType
|
|
642
|
+
): N | null;
|
|
643
|
+
|
|
571
644
|
/**
|
|
572
645
|
* The function `get` returns the first node in a binary tree that matches the given property or key.
|
|
573
|
-
* @param {
|
|
574
|
-
* the node that you want to find in the binary tree. It can be either a `
|
|
646
|
+
* @param {BTNKey | N} identifier - The `identifier` parameter is the key or value of
|
|
647
|
+
* the node that you want to find in the binary tree. It can be either a `BTNKey` or `N`
|
|
575
648
|
* type.
|
|
576
649
|
* @param callback - The `callback` parameter is a function that is used to determine whether a node
|
|
577
650
|
* matches the desired criteria. It takes a node as input and returns a boolean value indicating
|
|
@@ -583,7 +656,7 @@ export class BinaryTree<V = any, N extends BinaryTreeNode<V, N> = BinaryTreeNode
|
|
|
583
656
|
* performed when searching for a node in the binary tree. It can have one of the following values:
|
|
584
657
|
* @returns either the found node (of type N) or null if no node is found.
|
|
585
658
|
*/
|
|
586
|
-
get<C extends
|
|
659
|
+
get<C extends BTNCallback<N>>(
|
|
587
660
|
identifier: ReturnType<C> | null,
|
|
588
661
|
callback: C = this._defaultCallbackByKey as C,
|
|
589
662
|
beginRoot = this.root,
|
|
@@ -620,15 +693,15 @@ export class BinaryTree<V = any, N extends BinaryTreeNode<V, N> = BinaryTreeNode
|
|
|
620
693
|
/**
|
|
621
694
|
* The function `getLeftMost` returns the leftmost node in a binary tree, either using recursive or
|
|
622
695
|
* iterative traversal.
|
|
623
|
-
* @param {
|
|
696
|
+
* @param {BTNKey | N | null} beginRoot - The `beginRoot` parameter is the starting point
|
|
624
697
|
* for finding the leftmost node in a binary tree. It can be either a node object (`N`), a key value
|
|
625
|
-
* of a node (`
|
|
698
|
+
* of a node (`BTNKey`), or `null` if the tree is empty.
|
|
626
699
|
* @param iterationType - The `iterationType` parameter is used to determine the type of iteration to
|
|
627
700
|
* be performed when finding the leftmost node in a binary tree. It can have two possible values:
|
|
628
701
|
* @returns The function `getLeftMost` returns the leftmost node (`N`) in a binary tree. If there is
|
|
629
702
|
* no leftmost node, it returns `null`.
|
|
630
703
|
*/
|
|
631
|
-
getLeftMost(beginRoot:
|
|
704
|
+
getLeftMost(beginRoot: BTNKey | N | null = this.root, iterationType = this.iterationType): N | null {
|
|
632
705
|
if (typeof beginRoot === 'number') beginRoot = this.get(beginRoot);
|
|
633
706
|
|
|
634
707
|
if (!beginRoot) return beginRoot;
|
|
@@ -698,7 +771,7 @@ export class BinaryTree<V = any, N extends BinaryTreeNode<V, N> = BinaryTreeNode
|
|
|
698
771
|
if (!beginRoot) return true;
|
|
699
772
|
|
|
700
773
|
if (iterationType === IterationType.RECURSIVE) {
|
|
701
|
-
const dfs = (cur: N | null | undefined, min:
|
|
774
|
+
const dfs = (cur: N | null | undefined, min: BTNKey, max: BTNKey): boolean => {
|
|
702
775
|
if (!cur) return true;
|
|
703
776
|
if (cur.key <= min || cur.key >= max) return false;
|
|
704
777
|
return dfs(cur.left, min, cur.key) && dfs(cur.right, cur.key, max);
|
|
@@ -743,21 +816,21 @@ export class BinaryTree<V = any, N extends BinaryTreeNode<V, N> = BinaryTreeNode
|
|
|
743
816
|
* subtree traversal. It takes a single argument, which is the current node being traversed, and
|
|
744
817
|
* returns a value. The return values from each callback invocation will be collected and returned as
|
|
745
818
|
* an array.
|
|
746
|
-
* @param {
|
|
819
|
+
* @param {BTNKey | N | null} beginRoot - The `beginRoot` parameter is the starting point
|
|
747
820
|
* for traversing the subtree. It can be either a node object, a key value of a node, or `null` to
|
|
748
821
|
* start from the root of the tree.
|
|
749
822
|
* @param iterationType - The `iterationType` parameter determines the type of traversal to be
|
|
750
823
|
* performed on the binary tree. It can have two possible values:
|
|
751
|
-
* @returns The function `subTreeTraverse` returns an array of `ReturnType<
|
|
824
|
+
* @returns The function `subTreeTraverse` returns an array of `ReturnType<BTNCallback<N>>`.
|
|
752
825
|
*/
|
|
753
|
-
subTreeTraverse<C extends
|
|
826
|
+
subTreeTraverse<C extends BTNCallback<N>>(
|
|
754
827
|
callback: C = this._defaultCallbackByKey as C,
|
|
755
|
-
beginRoot:
|
|
828
|
+
beginRoot: BTNKey | N | null = this.root,
|
|
756
829
|
iterationType = this.iterationType
|
|
757
830
|
): ReturnType<C>[] {
|
|
758
831
|
if (typeof beginRoot === 'number') beginRoot = this.get(beginRoot);
|
|
759
832
|
|
|
760
|
-
const ans: ReturnType<
|
|
833
|
+
const ans: ReturnType<BTNCallback<N>>[] = [];
|
|
761
834
|
if (!beginRoot) return ans;
|
|
762
835
|
|
|
763
836
|
if (iterationType === IterationType.RECURSIVE) {
|
|
@@ -795,16 +868,16 @@ export class BinaryTree<V = any, N extends BinaryTreeNode<V, N> = BinaryTreeNode
|
|
|
795
868
|
* is `null`, an empty array will be returned.
|
|
796
869
|
* @param {IterationType} iterationType - The `iterationType` parameter determines the type of
|
|
797
870
|
* iteration used in the depth-first search algorithm. It can have two possible values:
|
|
798
|
-
* @returns The function `dfs` returns an array of `ReturnType<
|
|
871
|
+
* @returns The function `dfs` returns an array of `ReturnType<BTNCallback<N>>` values.
|
|
799
872
|
*/
|
|
800
|
-
dfs<C extends
|
|
873
|
+
dfs<C extends BTNCallback<N>>(
|
|
801
874
|
callback: C = this._defaultCallbackByKey as C,
|
|
802
875
|
pattern: DFSOrderPattern = 'in',
|
|
803
876
|
beginRoot: N | null = this.root,
|
|
804
877
|
iterationType: IterationType = IterationType.ITERATIVE
|
|
805
878
|
): ReturnType<C>[] {
|
|
806
879
|
if (!beginRoot) return [];
|
|
807
|
-
const ans: ReturnType<
|
|
880
|
+
const ans: ReturnType<BTNCallback<N>>[] = [];
|
|
808
881
|
if (iterationType === IterationType.RECURSIVE) {
|
|
809
882
|
const _traverse = (node: N) => {
|
|
810
883
|
switch (pattern) {
|
|
@@ -831,7 +904,7 @@ export class BinaryTree<V = any, N extends BinaryTreeNode<V, N> = BinaryTreeNode
|
|
|
831
904
|
_traverse(beginRoot);
|
|
832
905
|
} else {
|
|
833
906
|
// 0: visit, 1: print
|
|
834
|
-
const stack: {
|
|
907
|
+
const stack: {opt: 0 | 1; node: N | null | undefined}[] = [{opt: 0, node: beginRoot}];
|
|
835
908
|
|
|
836
909
|
while (stack.length > 0) {
|
|
837
910
|
const cur = stack.pop();
|
|
@@ -873,22 +946,22 @@ export class BinaryTree<V = any, N extends BinaryTreeNode<V, N> = BinaryTreeNode
|
|
|
873
946
|
* function on each node.
|
|
874
947
|
* @param callback - The `callback` parameter is a function that will be called for each node in the
|
|
875
948
|
* breadth-first search. It takes a node of type `N` as its argument and returns a value of type
|
|
876
|
-
* `ReturnType<
|
|
949
|
+
* `ReturnType<BTNCallback<N>>`. The default value for this parameter is `this._defaultCallbackByKey
|
|
877
950
|
* @param {N | null} beginRoot - The `beginRoot` parameter is the starting node for the breadth-first
|
|
878
951
|
* search. It determines from which node the search will begin. If `beginRoot` is `null`, the search
|
|
879
952
|
* will not be performed and an empty array will be returned.
|
|
880
953
|
* @param iterationType - The `iterationType` parameter determines the type of iteration to be used
|
|
881
954
|
* in the breadth-first search (BFS) algorithm. It can have two possible values:
|
|
882
|
-
* @returns The function `bfs` returns an array of `ReturnType<
|
|
955
|
+
* @returns The function `bfs` returns an array of `ReturnType<BTNCallback<N>>[]`.
|
|
883
956
|
*/
|
|
884
|
-
bfs<C extends
|
|
957
|
+
bfs<C extends BTNCallback<N>>(
|
|
885
958
|
callback: C = this._defaultCallbackByKey as C,
|
|
886
959
|
beginRoot: N | null = this.root,
|
|
887
960
|
iterationType = this.iterationType
|
|
888
961
|
): ReturnType<C>[] {
|
|
889
962
|
if (!beginRoot) return [];
|
|
890
963
|
|
|
891
|
-
const ans: ReturnType<
|
|
964
|
+
const ans: ReturnType<BTNCallback<N>>[] = [];
|
|
892
965
|
|
|
893
966
|
if (iterationType === IterationType.RECURSIVE) {
|
|
894
967
|
const queue = new Queue<N>([beginRoot]);
|
|
@@ -938,7 +1011,7 @@ export class BinaryTree<V = any, N extends BinaryTreeNode<V, N> = BinaryTreeNode
|
|
|
938
1011
|
* level in a binary tree. Each inner array contains the return type of the provided callback
|
|
939
1012
|
* function `C` applied to the nodes at that level.
|
|
940
1013
|
*/
|
|
941
|
-
listLevels<C extends
|
|
1014
|
+
listLevels<C extends BTNCallback<N>>(
|
|
942
1015
|
callback: C = this._defaultCallbackByKey as C,
|
|
943
1016
|
beginRoot: N | null = this.root,
|
|
944
1017
|
iterationType = this.iterationType
|
|
@@ -997,7 +1070,7 @@ export class BinaryTree<V = any, N extends BinaryTreeNode<V, N> = BinaryTreeNode
|
|
|
997
1070
|
* The `morris` function performs a depth-first traversal of a binary tree using the Morris traversal
|
|
998
1071
|
* algorithm and returns an array of values obtained by applying a callback function to each node.
|
|
999
1072
|
* @param callback - The `callback` parameter is a function that will be called on each node in the
|
|
1000
|
-
* tree. It takes a node of type `N` as input and returns a value of type `ReturnType<
|
|
1073
|
+
* tree. It takes a node of type `N` as input and returns a value of type `ReturnType<BTNCallback<N>>`. The
|
|
1001
1074
|
* default value for this parameter is `this._defaultCallbackByKey`.
|
|
1002
1075
|
* @param {DFSOrderPattern} [pattern=in] - The `pattern` parameter in the `morris` function
|
|
1003
1076
|
* determines the order in which the nodes of a binary tree are traversed. It can have one of the
|
|
@@ -1005,15 +1078,15 @@ export class BinaryTree<V = any, N extends BinaryTreeNode<V, N> = BinaryTreeNode
|
|
|
1005
1078
|
* @param {N | null} beginRoot - The `beginRoot` parameter is the starting node for the Morris
|
|
1006
1079
|
* traversal. It specifies the root node of the tree from which the traversal should begin. If
|
|
1007
1080
|
* `beginRoot` is `null`, an empty array will be returned.
|
|
1008
|
-
* @returns The `morris` function returns an array of `ReturnType<
|
|
1081
|
+
* @returns The `morris` function returns an array of `ReturnType<BTNCallback<N>>` values.
|
|
1009
1082
|
*/
|
|
1010
|
-
morris<C extends
|
|
1083
|
+
morris<C extends BTNCallback<N>>(
|
|
1011
1084
|
callback: C = this._defaultCallbackByKey as C,
|
|
1012
1085
|
pattern: DFSOrderPattern = 'in',
|
|
1013
1086
|
beginRoot: N | null = this.root
|
|
1014
1087
|
): ReturnType<C>[] {
|
|
1015
1088
|
if (beginRoot === null) return [];
|
|
1016
|
-
const ans: ReturnType<
|
|
1089
|
+
const ans: ReturnType<BTNCallback<N>>[] = [];
|
|
1017
1090
|
|
|
1018
1091
|
let cur: N | null | undefined = beginRoot;
|
|
1019
1092
|
const _reverseEdge = (node: N | null | undefined) => {
|
|
@@ -1101,7 +1174,7 @@ export class BinaryTree<V = any, N extends BinaryTreeNode<V, N> = BinaryTreeNode
|
|
|
1101
1174
|
* @returns The `*[Symbol.iterator]` method returns a generator object that yields the keys of the
|
|
1102
1175
|
* binary tree nodes in a specific order.
|
|
1103
1176
|
*/
|
|
1104
|
-
*
|
|
1177
|
+
*[Symbol.iterator](node = this.root): Generator<BTNKey, void, undefined> {
|
|
1105
1178
|
if (!node) {
|
|
1106
1179
|
return;
|
|
1107
1180
|
}
|
|
@@ -1122,7 +1195,6 @@ export class BinaryTree<V = any, N extends BinaryTreeNode<V, N> = BinaryTreeNode
|
|
|
1122
1195
|
if (current) current = current.right;
|
|
1123
1196
|
}
|
|
1124
1197
|
} else {
|
|
1125
|
-
|
|
1126
1198
|
if (node.left) {
|
|
1127
1199
|
yield* this[Symbol.iterator](node.left);
|
|
1128
1200
|
}
|
|
@@ -1131,10 +1203,8 @@ export class BinaryTree<V = any, N extends BinaryTreeNode<V, N> = BinaryTreeNode
|
|
|
1131
1203
|
yield* this[Symbol.iterator](node.right);
|
|
1132
1204
|
}
|
|
1133
1205
|
}
|
|
1134
|
-
|
|
1135
1206
|
}
|
|
1136
1207
|
|
|
1137
|
-
|
|
1138
1208
|
/**
|
|
1139
1209
|
* Swap the data of two nodes in the binary tree.
|
|
1140
1210
|
* @param {N} srcNode - The source node to swap.
|
|
@@ -1163,7 +1233,7 @@ export class BinaryTree<V = any, N extends BinaryTreeNode<V, N> = BinaryTreeNode
|
|
|
1163
1233
|
* the tree's structure should be restored to its original state to maintain the tree's integrity.
|
|
1164
1234
|
* This is because the purpose of the Morris algorithm is to save space rather than permanently alter the tree's shape.
|
|
1165
1235
|
*/
|
|
1166
|
-
protected _defaultCallbackByKey:
|
|
1236
|
+
protected _defaultCallbackByKey: BTNCallback<N, BTNKey> = node => node.key;
|
|
1167
1237
|
|
|
1168
1238
|
/**
|
|
1169
1239
|
* The function `_addTo` adds a new node to a binary tree if there is an available position.
|