max-priority-queue-typed 2.4.5 → 2.5.1
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/README.md +63 -0
- package/dist/cjs/index.cjs +694 -119
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs-legacy/index.cjs +693 -118
- package/dist/cjs-legacy/index.cjs.map +1 -1
- package/dist/esm/index.mjs +694 -119
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm-legacy/index.mjs +693 -118
- package/dist/esm-legacy/index.mjs.map +1 -1
- package/dist/types/data-structures/base/index.d.ts +1 -0
- package/dist/types/data-structures/base/iterable-element-base.d.ts +1 -1
- package/dist/types/data-structures/base/iterable-entry-base.d.ts +8 -8
- package/dist/types/data-structures/base/linear-base.d.ts +3 -3
- package/dist/types/data-structures/binary-tree/avl-tree.d.ts +380 -51
- package/dist/types/data-structures/binary-tree/binary-indexed-tree.d.ts +487 -147
- package/dist/types/data-structures/binary-tree/binary-tree.d.ts +956 -80
- package/dist/types/data-structures/binary-tree/bst.d.ts +816 -29
- package/dist/types/data-structures/binary-tree/red-black-tree.d.ts +610 -31
- package/dist/types/data-structures/binary-tree/segment-tree.d.ts +326 -135
- package/dist/types/data-structures/binary-tree/tree-map.d.ts +3781 -6
- package/dist/types/data-structures/binary-tree/tree-multi-map.d.ts +3607 -201
- package/dist/types/data-structures/binary-tree/tree-multi-set.d.ts +2874 -65
- package/dist/types/data-structures/binary-tree/tree-set.d.ts +3528 -6
- package/dist/types/data-structures/graph/abstract-graph.d.ts +4 -4
- package/dist/types/data-structures/graph/directed-graph.d.ts +429 -47
- package/dist/types/data-structures/graph/map-graph.d.ts +59 -1
- package/dist/types/data-structures/graph/undirected-graph.d.ts +393 -59
- package/dist/types/data-structures/hash/hash-map.d.ts +473 -89
- package/dist/types/data-structures/heap/heap.d.ts +581 -99
- package/dist/types/data-structures/heap/max-heap.d.ts +46 -0
- package/dist/types/data-structures/heap/min-heap.d.ts +59 -0
- package/dist/types/data-structures/linked-list/doubly-linked-list.d.ts +646 -47
- package/dist/types/data-structures/linked-list/singly-linked-list.d.ts +596 -68
- package/dist/types/data-structures/linked-list/skip-linked-list.d.ts +793 -12
- package/dist/types/data-structures/matrix/matrix.d.ts +499 -0
- package/dist/types/data-structures/priority-queue/max-priority-queue.d.ts +57 -0
- package/dist/types/data-structures/priority-queue/min-priority-queue.d.ts +60 -0
- package/dist/types/data-structures/priority-queue/priority-queue.d.ts +60 -0
- package/dist/types/data-structures/queue/deque.d.ts +593 -71
- package/dist/types/data-structures/queue/queue.d.ts +463 -42
- package/dist/types/data-structures/stack/stack.d.ts +384 -32
- package/dist/types/data-structures/trie/trie.d.ts +470 -48
- package/dist/types/interfaces/graph.d.ts +1 -1
- package/dist/types/types/common.d.ts +2 -2
- package/dist/types/types/data-structures/binary-tree/segment-tree.d.ts +1 -1
- package/dist/types/types/data-structures/heap/heap.d.ts +1 -0
- package/dist/types/types/data-structures/linked-list/skip-linked-list.d.ts +1 -4
- package/dist/types/types/data-structures/priority-queue/priority-queue.d.ts +1 -0
- package/dist/types/types/utils/validate-type.d.ts +4 -4
- package/dist/umd/max-priority-queue-typed.js +691 -116
- package/dist/umd/max-priority-queue-typed.js.map +1 -1
- package/dist/umd/max-priority-queue-typed.min.js +1 -1
- package/dist/umd/max-priority-queue-typed.min.js.map +1 -1
- package/package.json +2 -2
- package/src/data-structures/base/index.ts +1 -0
- package/src/data-structures/base/iterable-element-base.ts +4 -5
- package/src/data-structures/base/iterable-entry-base.ts +8 -8
- package/src/data-structures/base/linear-base.ts +3 -3
- package/src/data-structures/binary-tree/avl-tree.ts +386 -51
- package/src/data-structures/binary-tree/binary-indexed-tree.ts +596 -247
- package/src/data-structures/binary-tree/binary-tree.ts +956 -81
- package/src/data-structures/binary-tree/bst.ts +840 -35
- package/src/data-structures/binary-tree/red-black-tree.ts +689 -97
- package/src/data-structures/binary-tree/segment-tree.ts +498 -249
- package/src/data-structures/binary-tree/tree-map.ts +3784 -7
- package/src/data-structures/binary-tree/tree-multi-map.ts +3614 -211
- package/src/data-structures/binary-tree/tree-multi-set.ts +2874 -65
- package/src/data-structures/binary-tree/tree-set.ts +3531 -10
- package/src/data-structures/graph/abstract-graph.ts +4 -4
- package/src/data-structures/graph/directed-graph.ts +429 -47
- package/src/data-structures/graph/map-graph.ts +59 -1
- package/src/data-structures/graph/undirected-graph.ts +393 -59
- package/src/data-structures/hash/hash-map.ts +476 -92
- package/src/data-structures/heap/heap.ts +581 -99
- package/src/data-structures/heap/max-heap.ts +46 -0
- package/src/data-structures/heap/min-heap.ts +59 -0
- package/src/data-structures/linked-list/doubly-linked-list.ts +646 -47
- package/src/data-structures/linked-list/singly-linked-list.ts +596 -68
- package/src/data-structures/linked-list/skip-linked-list.ts +1067 -90
- package/src/data-structures/matrix/matrix.ts +584 -12
- package/src/data-structures/priority-queue/max-priority-queue.ts +57 -0
- package/src/data-structures/priority-queue/min-priority-queue.ts +60 -0
- package/src/data-structures/priority-queue/priority-queue.ts +60 -0
- package/src/data-structures/queue/deque.ts +592 -70
- package/src/data-structures/queue/queue.ts +463 -42
- package/src/data-structures/stack/stack.ts +384 -32
- package/src/data-structures/trie/trie.ts +470 -48
- package/src/interfaces/graph.ts +1 -1
- package/src/types/common.ts +2 -2
- package/src/types/data-structures/binary-tree/segment-tree.ts +1 -1
- package/src/types/data-structures/heap/heap.ts +1 -0
- package/src/types/data-structures/linked-list/skip-linked-list.ts +2 -1
- package/src/types/data-structures/priority-queue/priority-queue.ts +1 -0
- package/src/types/utils/validate-type.ts +4 -4
|
@@ -105,6 +105,7 @@ export class BSTNode<K = any, V = any> {
|
|
|
105
105
|
*
|
|
106
106
|
* @returns The height.
|
|
107
107
|
*/
|
|
108
|
+
/* istanbul ignore next -- covered by AVLTree/RedBlackTree tests (subclass uses height) */
|
|
108
109
|
get height(): number {
|
|
109
110
|
return this._height;
|
|
110
111
|
}
|
|
@@ -115,6 +116,7 @@ export class BSTNode<K = any, V = any> {
|
|
|
115
116
|
*
|
|
116
117
|
* @param value - The new height.
|
|
117
118
|
*/
|
|
119
|
+
/* istanbul ignore next -- covered by AVLTree/RedBlackTree tests (subclass uses height) */
|
|
118
120
|
set height(value: number) {
|
|
119
121
|
this._height = value;
|
|
120
122
|
}
|
|
@@ -127,6 +129,7 @@ export class BSTNode<K = any, V = any> {
|
|
|
127
129
|
*
|
|
128
130
|
* @returns The node's color.
|
|
129
131
|
*/
|
|
132
|
+
/* istanbul ignore next -- covered by RedBlackTree tests (subclass uses color) */
|
|
130
133
|
get color(): RBTNColor {
|
|
131
134
|
return this._color;
|
|
132
135
|
}
|
|
@@ -137,6 +140,7 @@ export class BSTNode<K = any, V = any> {
|
|
|
137
140
|
*
|
|
138
141
|
* @param value - The new color.
|
|
139
142
|
*/
|
|
143
|
+
/* istanbul ignore next -- covered by RedBlackTree tests (subclass uses color) */
|
|
140
144
|
set color(value: RBTNColor) {
|
|
141
145
|
this._color = value;
|
|
142
146
|
}
|
|
@@ -149,6 +153,7 @@ export class BSTNode<K = any, V = any> {
|
|
|
149
153
|
*
|
|
150
154
|
* @returns The subtree node count.
|
|
151
155
|
*/
|
|
156
|
+
/* istanbul ignore next -- internal field used by subclasses */
|
|
152
157
|
get count(): number {
|
|
153
158
|
return this._count;
|
|
154
159
|
}
|
|
@@ -159,6 +164,7 @@ export class BSTNode<K = any, V = any> {
|
|
|
159
164
|
*
|
|
160
165
|
* @param value - The new count.
|
|
161
166
|
*/
|
|
167
|
+
/* istanbul ignore next -- internal field used by subclasses */
|
|
162
168
|
set count(value: number) {
|
|
163
169
|
this._count = value;
|
|
164
170
|
}
|
|
@@ -200,34 +206,6 @@ export class BSTNode<K = any, V = any> {
|
|
|
200
206
|
* 7. No Auto-Balancing: Standard BSTs don't automatically balance themselves.
|
|
201
207
|
*
|
|
202
208
|
* @example
|
|
203
|
-
* // basic BST creation and add operation
|
|
204
|
-
* // Create a simple BST with numeric keys
|
|
205
|
-
* const bst = new BST<number>([11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5]);
|
|
206
|
-
*
|
|
207
|
-
* // Keep the example output in source comments but avoid noisy test logs.
|
|
208
|
-
* await withMutedConsole(() => bst.print());
|
|
209
|
-
* // _______8__________
|
|
210
|
-
* // / \
|
|
211
|
-
* // ___4___ ____12_____
|
|
212
|
-
* // / \ / \
|
|
213
|
-
* // _2_ _6_ _10__ _14__
|
|
214
|
-
* // / \ / \ / \ / \
|
|
215
|
-
* // 1 3 5 7 9 11 13 15__
|
|
216
|
-
* // \
|
|
217
|
-
* // 16
|
|
218
|
-
*
|
|
219
|
-
* // Verify size
|
|
220
|
-
* console.log(bst.size); // 16;
|
|
221
|
-
*
|
|
222
|
-
* // Add new elements
|
|
223
|
-
* bst.set(17);
|
|
224
|
-
* bst.set(0);
|
|
225
|
-
* console.log(bst.size); // 18;
|
|
226
|
-
*
|
|
227
|
-
* // Verify keys are searchable
|
|
228
|
-
* console.log(bst.has(11)); // true;
|
|
229
|
-
* console.log(bst.has(100)); // false;
|
|
230
|
-
* @example
|
|
231
209
|
* // BST delete and search after deletion
|
|
232
210
|
* const bst = new BST<number>([11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5]);
|
|
233
211
|
*
|
|
@@ -450,10 +428,82 @@ export class BST<K = any, V = any, R = any> extends BinaryTree<K, V, R> implemen
|
|
|
450
428
|
* @param key - The key to validate.
|
|
451
429
|
* @returns True if the key is valid, false otherwise.
|
|
452
430
|
*/
|
|
453
|
-
override isValidKey(key:
|
|
431
|
+
override isValidKey(key: unknown): key is K {
|
|
454
432
|
return isComparable(key);
|
|
455
433
|
}
|
|
456
434
|
|
|
435
|
+
/**
|
|
436
|
+
* Depth-first search traversal
|
|
437
|
+
|
|
438
|
+
|
|
439
|
+
|
|
440
|
+
|
|
441
|
+
|
|
442
|
+
|
|
443
|
+
|
|
444
|
+
|
|
445
|
+
|
|
446
|
+
|
|
447
|
+
|
|
448
|
+
|
|
449
|
+
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
|
|
453
|
+
|
|
454
|
+
|
|
455
|
+
|
|
456
|
+
|
|
457
|
+
|
|
458
|
+
|
|
459
|
+
|
|
460
|
+
|
|
461
|
+
|
|
462
|
+
|
|
463
|
+
|
|
464
|
+
|
|
465
|
+
|
|
466
|
+
|
|
467
|
+
|
|
468
|
+
|
|
469
|
+
|
|
470
|
+
|
|
471
|
+
|
|
472
|
+
|
|
473
|
+
|
|
474
|
+
|
|
475
|
+
|
|
476
|
+
|
|
477
|
+
|
|
478
|
+
|
|
479
|
+
|
|
480
|
+
|
|
481
|
+
|
|
482
|
+
|
|
483
|
+
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
|
|
487
|
+
|
|
488
|
+
|
|
489
|
+
|
|
490
|
+
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
|
|
494
|
+
|
|
495
|
+
|
|
496
|
+
|
|
497
|
+
|
|
498
|
+
|
|
499
|
+
|
|
500
|
+
|
|
501
|
+
* @example
|
|
502
|
+
* // Depth-first traversal
|
|
503
|
+
* const bst = new BST<number>([5, 3, 7, 1, 4]);
|
|
504
|
+
* const inOrder = bst.dfs(node => node.key, 'IN');
|
|
505
|
+
* console.log(inOrder); // [1, 3, 4, 5, 7];
|
|
506
|
+
*/
|
|
457
507
|
override dfs(): (K | undefined)[];
|
|
458
508
|
|
|
459
509
|
override dfs<C extends NodeCallback<BSTNode<K, V>>>(
|
|
@@ -486,6 +536,70 @@ export class BST<K = any, V = any, R = any> extends BinaryTree<K, V, R> implemen
|
|
|
486
536
|
return super.dfs(callback, pattern, onlyOne, startNode, iterationType);
|
|
487
537
|
}
|
|
488
538
|
|
|
539
|
+
/**
|
|
540
|
+
* BinaryTree level-order traversal
|
|
541
|
+
|
|
542
|
+
|
|
543
|
+
|
|
544
|
+
|
|
545
|
+
|
|
546
|
+
|
|
547
|
+
|
|
548
|
+
|
|
549
|
+
|
|
550
|
+
|
|
551
|
+
|
|
552
|
+
|
|
553
|
+
|
|
554
|
+
|
|
555
|
+
|
|
556
|
+
|
|
557
|
+
|
|
558
|
+
|
|
559
|
+
|
|
560
|
+
|
|
561
|
+
|
|
562
|
+
|
|
563
|
+
|
|
564
|
+
|
|
565
|
+
|
|
566
|
+
|
|
567
|
+
|
|
568
|
+
|
|
569
|
+
|
|
570
|
+
|
|
571
|
+
|
|
572
|
+
|
|
573
|
+
|
|
574
|
+
|
|
575
|
+
|
|
576
|
+
|
|
577
|
+
|
|
578
|
+
|
|
579
|
+
|
|
580
|
+
|
|
581
|
+
|
|
582
|
+
|
|
583
|
+
|
|
584
|
+
|
|
585
|
+
|
|
586
|
+
|
|
587
|
+
|
|
588
|
+
|
|
589
|
+
|
|
590
|
+
|
|
591
|
+
|
|
592
|
+
|
|
593
|
+
|
|
594
|
+
|
|
595
|
+
|
|
596
|
+
|
|
597
|
+
* @example
|
|
598
|
+
* // Breadth-first traversal
|
|
599
|
+
* const bst = new BST<number>([5, 3, 7]);
|
|
600
|
+
* const result = bst.bfs(node => node.key);
|
|
601
|
+
* console.log(result.length); // 3;
|
|
602
|
+
*/
|
|
489
603
|
override bfs(): (K | undefined)[];
|
|
490
604
|
override bfs<C extends NodeCallback<BSTNode<K, V>>>(
|
|
491
605
|
callback: C,
|
|
@@ -511,6 +625,76 @@ export class BST<K = any, V = any, R = any> extends BinaryTree<K, V, R> implemen
|
|
|
511
625
|
return super.bfs(callback, startNode, iterationType, false);
|
|
512
626
|
}
|
|
513
627
|
|
|
628
|
+
/**
|
|
629
|
+
* Level-order grouping
|
|
630
|
+
|
|
631
|
+
|
|
632
|
+
|
|
633
|
+
|
|
634
|
+
|
|
635
|
+
|
|
636
|
+
|
|
637
|
+
|
|
638
|
+
|
|
639
|
+
|
|
640
|
+
|
|
641
|
+
|
|
642
|
+
|
|
643
|
+
|
|
644
|
+
|
|
645
|
+
|
|
646
|
+
|
|
647
|
+
|
|
648
|
+
|
|
649
|
+
|
|
650
|
+
|
|
651
|
+
|
|
652
|
+
|
|
653
|
+
|
|
654
|
+
|
|
655
|
+
|
|
656
|
+
|
|
657
|
+
|
|
658
|
+
|
|
659
|
+
|
|
660
|
+
|
|
661
|
+
|
|
662
|
+
|
|
663
|
+
|
|
664
|
+
|
|
665
|
+
|
|
666
|
+
|
|
667
|
+
|
|
668
|
+
|
|
669
|
+
|
|
670
|
+
|
|
671
|
+
|
|
672
|
+
|
|
673
|
+
|
|
674
|
+
|
|
675
|
+
|
|
676
|
+
|
|
677
|
+
|
|
678
|
+
|
|
679
|
+
|
|
680
|
+
|
|
681
|
+
|
|
682
|
+
|
|
683
|
+
|
|
684
|
+
|
|
685
|
+
|
|
686
|
+
|
|
687
|
+
|
|
688
|
+
|
|
689
|
+
* @example
|
|
690
|
+
* // Level-order grouping
|
|
691
|
+
* const bst = new BST<number>([5, 3, 7, 1, 4]);
|
|
692
|
+
* const levels = bst.listLevels(node => node.key);
|
|
693
|
+
* console.log(levels.length); // > 0;
|
|
694
|
+
* console.log(levels[0].length); // 1; // root level has 1 node
|
|
695
|
+
* const allKeys = levels.flat().sort((a, b) => a - b);
|
|
696
|
+
* console.log(allKeys); // [1, 3, 4, 5, 7];
|
|
697
|
+
*/
|
|
514
698
|
override listLevels(): (K | undefined)[][];
|
|
515
699
|
|
|
516
700
|
override listLevels<C extends NodeCallback<BSTNode<K, V>>>(
|
|
@@ -545,6 +729,73 @@ export class BST<K = any, V = any, R = any> extends BinaryTree<K, V, R> implemen
|
|
|
545
729
|
* @param [startNode=this._root] - The node to start the search from.
|
|
546
730
|
* @param [iterationType=this.iterationType] - The traversal method.
|
|
547
731
|
* @returns The first matching node, or undefined if not found.
|
|
732
|
+
|
|
733
|
+
|
|
734
|
+
|
|
735
|
+
|
|
736
|
+
|
|
737
|
+
|
|
738
|
+
|
|
739
|
+
|
|
740
|
+
|
|
741
|
+
|
|
742
|
+
|
|
743
|
+
|
|
744
|
+
|
|
745
|
+
|
|
746
|
+
|
|
747
|
+
|
|
748
|
+
|
|
749
|
+
|
|
750
|
+
|
|
751
|
+
|
|
752
|
+
|
|
753
|
+
|
|
754
|
+
|
|
755
|
+
|
|
756
|
+
|
|
757
|
+
|
|
758
|
+
|
|
759
|
+
|
|
760
|
+
|
|
761
|
+
|
|
762
|
+
|
|
763
|
+
|
|
764
|
+
|
|
765
|
+
|
|
766
|
+
|
|
767
|
+
|
|
768
|
+
|
|
769
|
+
|
|
770
|
+
|
|
771
|
+
|
|
772
|
+
|
|
773
|
+
|
|
774
|
+
|
|
775
|
+
|
|
776
|
+
|
|
777
|
+
|
|
778
|
+
|
|
779
|
+
|
|
780
|
+
|
|
781
|
+
|
|
782
|
+
|
|
783
|
+
|
|
784
|
+
|
|
785
|
+
|
|
786
|
+
|
|
787
|
+
|
|
788
|
+
|
|
789
|
+
|
|
790
|
+
|
|
791
|
+
|
|
792
|
+
|
|
793
|
+
* @example
|
|
794
|
+
* // Get node object by key
|
|
795
|
+
* const bst = new BST<number, string>([[5, 'root'], [3, 'left'], [7, 'right']]);
|
|
796
|
+
* const node = bst.getNode(3);
|
|
797
|
+
* console.log(node?.key); // 3;
|
|
798
|
+
* console.log(node?.value); // 'left';
|
|
548
799
|
*/
|
|
549
800
|
override getNode(
|
|
550
801
|
keyNodeEntryOrPredicate:
|
|
@@ -606,6 +857,68 @@ export class BST<K = any, V = any, R = any> extends BinaryTree<K, V, R> implemen
|
|
|
606
857
|
}
|
|
607
858
|
|
|
608
859
|
|
|
860
|
+
/**
|
|
861
|
+
* Search nodes by predicate
|
|
862
|
+
|
|
863
|
+
|
|
864
|
+
|
|
865
|
+
|
|
866
|
+
|
|
867
|
+
|
|
868
|
+
|
|
869
|
+
|
|
870
|
+
|
|
871
|
+
|
|
872
|
+
|
|
873
|
+
|
|
874
|
+
|
|
875
|
+
|
|
876
|
+
|
|
877
|
+
|
|
878
|
+
|
|
879
|
+
|
|
880
|
+
|
|
881
|
+
|
|
882
|
+
|
|
883
|
+
|
|
884
|
+
|
|
885
|
+
|
|
886
|
+
|
|
887
|
+
|
|
888
|
+
|
|
889
|
+
|
|
890
|
+
|
|
891
|
+
|
|
892
|
+
|
|
893
|
+
|
|
894
|
+
|
|
895
|
+
|
|
896
|
+
|
|
897
|
+
|
|
898
|
+
|
|
899
|
+
|
|
900
|
+
|
|
901
|
+
|
|
902
|
+
|
|
903
|
+
|
|
904
|
+
|
|
905
|
+
|
|
906
|
+
|
|
907
|
+
|
|
908
|
+
|
|
909
|
+
|
|
910
|
+
|
|
911
|
+
|
|
912
|
+
|
|
913
|
+
|
|
914
|
+
|
|
915
|
+
|
|
916
|
+
* @example
|
|
917
|
+
* // Search nodes by predicate
|
|
918
|
+
* const bst = new BST<number, string>([[1, 'a'], [2, 'b'], [3, 'c'], [4, 'd']]);
|
|
919
|
+
* const found = bst.search(node => node.key > 2, true);
|
|
920
|
+
* console.log(found.length); // >= 1;
|
|
921
|
+
*/
|
|
609
922
|
override search(
|
|
610
923
|
keyNodeEntryOrPredicate:
|
|
611
924
|
| K
|
|
@@ -699,6 +1012,7 @@ export class BST<K = any, V = any, R = any> extends BinaryTree<K, V, R> implemen
|
|
|
699
1012
|
let predicate: NodePredicate<BSTNode<K, V>>;
|
|
700
1013
|
if (isRange) {
|
|
701
1014
|
predicate = node => {
|
|
1015
|
+
/* istanbul ignore next -- node is always defined in iteration callbacks */
|
|
702
1016
|
if (!node) return false;
|
|
703
1017
|
return (keyNodeEntryOrPredicate).isInRange(node.key, this._comparator);
|
|
704
1018
|
};
|
|
@@ -708,7 +1022,7 @@ export class BST<K = any, V = any, R = any> extends BinaryTree<K, V, R> implemen
|
|
|
708
1022
|
|
|
709
1023
|
// Optimization: Pruning logic
|
|
710
1024
|
const shouldVisitLeft = (cur: BSTNode<K, V> | null | undefined) => {
|
|
711
|
-
if (!cur) return false;
|
|
1025
|
+
/* istanbul ignore next -- defensive: cur is always defined when called from iteration */ if (!cur) return false;
|
|
712
1026
|
if (!this.isRealNode(cur.left)) return false;
|
|
713
1027
|
if (isRange) {
|
|
714
1028
|
// Range search: Only go left if the current key is >= the lower bound
|
|
@@ -726,7 +1040,7 @@ export class BST<K = any, V = any, R = any> extends BinaryTree<K, V, R> implemen
|
|
|
726
1040
|
};
|
|
727
1041
|
|
|
728
1042
|
const shouldVisitRight = (cur: BSTNode<K, V> | null | undefined) => {
|
|
729
|
-
if (!cur) return false;
|
|
1043
|
+
/* istanbul ignore next -- defensive */ if (!cur) return false;
|
|
730
1044
|
if (!this.isRealNode(cur.right)) return false;
|
|
731
1045
|
if (isRange) {
|
|
732
1046
|
// Range search: Only go right if current key <= upper bound
|
|
@@ -757,6 +1071,45 @@ export class BST<K = any, V = any, R = any> extends BinaryTree<K, V, R> implemen
|
|
|
757
1071
|
);
|
|
758
1072
|
}
|
|
759
1073
|
|
|
1074
|
+
/**
|
|
1075
|
+
* Find all keys in a range
|
|
1076
|
+
|
|
1077
|
+
|
|
1078
|
+
|
|
1079
|
+
|
|
1080
|
+
|
|
1081
|
+
|
|
1082
|
+
|
|
1083
|
+
|
|
1084
|
+
|
|
1085
|
+
|
|
1086
|
+
|
|
1087
|
+
|
|
1088
|
+
|
|
1089
|
+
|
|
1090
|
+
|
|
1091
|
+
|
|
1092
|
+
|
|
1093
|
+
|
|
1094
|
+
|
|
1095
|
+
|
|
1096
|
+
|
|
1097
|
+
|
|
1098
|
+
|
|
1099
|
+
|
|
1100
|
+
|
|
1101
|
+
|
|
1102
|
+
|
|
1103
|
+
|
|
1104
|
+
|
|
1105
|
+
|
|
1106
|
+
|
|
1107
|
+
|
|
1108
|
+
* @example
|
|
1109
|
+
* // Find all keys in a range
|
|
1110
|
+
* const bst = new BST<number>([10, 20, 30, 40, 50]);
|
|
1111
|
+
* console.log(bst.rangeSearch([15, 35])); // [20, 30];
|
|
1112
|
+
*/
|
|
760
1113
|
rangeSearch(range: Range<K> | [K, K]): (K | undefined)[];
|
|
761
1114
|
|
|
762
1115
|
rangeSearch<C extends NodeCallback<BSTNode<K, V>>>(
|
|
@@ -794,6 +1147,100 @@ export class BST<K = any, V = any, R = any> extends BinaryTree<K, V, R> implemen
|
|
|
794
1147
|
* @param keyNodeOrEntry - The key, node, or entry to set.
|
|
795
1148
|
* @param [value] - The value, if providing just a key.
|
|
796
1149
|
* @returns True if the addition was successful, false otherwise.
|
|
1150
|
+
|
|
1151
|
+
|
|
1152
|
+
|
|
1153
|
+
|
|
1154
|
+
|
|
1155
|
+
|
|
1156
|
+
|
|
1157
|
+
|
|
1158
|
+
|
|
1159
|
+
|
|
1160
|
+
|
|
1161
|
+
|
|
1162
|
+
|
|
1163
|
+
|
|
1164
|
+
|
|
1165
|
+
|
|
1166
|
+
|
|
1167
|
+
|
|
1168
|
+
|
|
1169
|
+
|
|
1170
|
+
|
|
1171
|
+
|
|
1172
|
+
|
|
1173
|
+
|
|
1174
|
+
|
|
1175
|
+
|
|
1176
|
+
|
|
1177
|
+
|
|
1178
|
+
|
|
1179
|
+
|
|
1180
|
+
|
|
1181
|
+
|
|
1182
|
+
|
|
1183
|
+
|
|
1184
|
+
|
|
1185
|
+
|
|
1186
|
+
|
|
1187
|
+
|
|
1188
|
+
|
|
1189
|
+
|
|
1190
|
+
|
|
1191
|
+
|
|
1192
|
+
|
|
1193
|
+
|
|
1194
|
+
|
|
1195
|
+
|
|
1196
|
+
|
|
1197
|
+
|
|
1198
|
+
|
|
1199
|
+
|
|
1200
|
+
|
|
1201
|
+
|
|
1202
|
+
|
|
1203
|
+
|
|
1204
|
+
|
|
1205
|
+
|
|
1206
|
+
|
|
1207
|
+
|
|
1208
|
+
|
|
1209
|
+
|
|
1210
|
+
|
|
1211
|
+
|
|
1212
|
+
|
|
1213
|
+
|
|
1214
|
+
|
|
1215
|
+
|
|
1216
|
+
|
|
1217
|
+
|
|
1218
|
+
|
|
1219
|
+
|
|
1220
|
+
|
|
1221
|
+
|
|
1222
|
+
|
|
1223
|
+
|
|
1224
|
+
|
|
1225
|
+
|
|
1226
|
+
|
|
1227
|
+
|
|
1228
|
+
|
|
1229
|
+
|
|
1230
|
+
|
|
1231
|
+
|
|
1232
|
+
|
|
1233
|
+
|
|
1234
|
+
|
|
1235
|
+
|
|
1236
|
+
|
|
1237
|
+
|
|
1238
|
+
* @example
|
|
1239
|
+
* // Set a key-value pair
|
|
1240
|
+
* const bst = new BST<number, string>();
|
|
1241
|
+
* bst.set(1, 'one');
|
|
1242
|
+
* bst.set(2, 'two');
|
|
1243
|
+
* console.log(bst.get(1)); // 'one';
|
|
797
1244
|
*/
|
|
798
1245
|
override set(
|
|
799
1246
|
keyNodeOrEntry: K | BSTNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,
|
|
@@ -836,6 +1283,7 @@ export class BST<K = any, V = any, R = any> extends BinaryTree<K, V, R> implemen
|
|
|
836
1283
|
if (current.right !== null) current = current.right;
|
|
837
1284
|
}
|
|
838
1285
|
}
|
|
1286
|
+
/* istanbul ignore next -- defensive: traversal always finds undefined slot before exhausting tree */
|
|
839
1287
|
return false;
|
|
840
1288
|
}
|
|
841
1289
|
|
|
@@ -850,6 +1298,65 @@ export class BST<K = any, V = any, R = any> extends BinaryTree<K, V, R> implemen
|
|
|
850
1298
|
* @param [isBalanceAdd=true] - If true, builds a balanced tree from the items.
|
|
851
1299
|
* @param [iterationType=this.iterationType] - The traversal method for balanced set (recursive or iterative).
|
|
852
1300
|
* @returns An array of booleans indicating the success of each individual `set` operation.
|
|
1301
|
+
|
|
1302
|
+
|
|
1303
|
+
|
|
1304
|
+
|
|
1305
|
+
|
|
1306
|
+
|
|
1307
|
+
|
|
1308
|
+
|
|
1309
|
+
|
|
1310
|
+
|
|
1311
|
+
|
|
1312
|
+
|
|
1313
|
+
|
|
1314
|
+
|
|
1315
|
+
|
|
1316
|
+
|
|
1317
|
+
|
|
1318
|
+
|
|
1319
|
+
|
|
1320
|
+
|
|
1321
|
+
|
|
1322
|
+
|
|
1323
|
+
|
|
1324
|
+
|
|
1325
|
+
|
|
1326
|
+
|
|
1327
|
+
|
|
1328
|
+
|
|
1329
|
+
|
|
1330
|
+
|
|
1331
|
+
|
|
1332
|
+
|
|
1333
|
+
|
|
1334
|
+
|
|
1335
|
+
|
|
1336
|
+
|
|
1337
|
+
|
|
1338
|
+
|
|
1339
|
+
|
|
1340
|
+
|
|
1341
|
+
|
|
1342
|
+
|
|
1343
|
+
|
|
1344
|
+
|
|
1345
|
+
|
|
1346
|
+
|
|
1347
|
+
|
|
1348
|
+
|
|
1349
|
+
|
|
1350
|
+
|
|
1351
|
+
|
|
1352
|
+
|
|
1353
|
+
|
|
1354
|
+
* @example
|
|
1355
|
+
* // Set multiple key-value pairs
|
|
1356
|
+
* const bst = new BST<number, string>();
|
|
1357
|
+
* bst.setMany([[1, 'a'], [2, 'b'], [3, 'c']]);
|
|
1358
|
+
* console.log(bst.size); // 3;
|
|
1359
|
+
* console.log(bst.get(2)); // 'b';
|
|
853
1360
|
*/
|
|
854
1361
|
override setMany(
|
|
855
1362
|
keysNodesEntriesOrRaws: Iterable<R | BTNRep<K, V, BSTNode<K, V>>>,
|
|
@@ -920,6 +1427,7 @@ export class BST<K = any, V = any, R = any> extends BinaryTree<K, V, R> implemen
|
|
|
920
1427
|
const stack: Array<[number, number]> = [[0, n - 1]];
|
|
921
1428
|
while (stack.length > 0) {
|
|
922
1429
|
const popped = stack.pop();
|
|
1430
|
+
/* istanbul ignore next -- stack.pop() on non-empty stack always returns a value */
|
|
923
1431
|
if (!popped) continue;
|
|
924
1432
|
const [l, r] = popped;
|
|
925
1433
|
if (l > r) continue;
|
|
@@ -947,6 +1455,44 @@ export class BST<K = any, V = any, R = any> extends BinaryTree<K, V, R> implemen
|
|
|
947
1455
|
* Equivalent to Java TreeMap.ceiling.
|
|
948
1456
|
* Time Complexity: O(log n) average, O(h) worst case.
|
|
949
1457
|
* Space Complexity: O(h) for recursion, O(1) for iteration.
|
|
1458
|
+
|
|
1459
|
+
|
|
1460
|
+
|
|
1461
|
+
|
|
1462
|
+
|
|
1463
|
+
|
|
1464
|
+
|
|
1465
|
+
|
|
1466
|
+
|
|
1467
|
+
|
|
1468
|
+
|
|
1469
|
+
|
|
1470
|
+
|
|
1471
|
+
|
|
1472
|
+
|
|
1473
|
+
|
|
1474
|
+
|
|
1475
|
+
|
|
1476
|
+
|
|
1477
|
+
|
|
1478
|
+
|
|
1479
|
+
|
|
1480
|
+
|
|
1481
|
+
|
|
1482
|
+
|
|
1483
|
+
|
|
1484
|
+
|
|
1485
|
+
|
|
1486
|
+
|
|
1487
|
+
|
|
1488
|
+
|
|
1489
|
+
|
|
1490
|
+
* @example
|
|
1491
|
+
* // Find the least key ≥ target
|
|
1492
|
+
* const bst = new BST<number>([10, 20, 30, 40, 50]);
|
|
1493
|
+
* console.log(bst.ceiling(25)); // 30;
|
|
1494
|
+
* console.log(bst.ceiling(30)); // 30;
|
|
1495
|
+
* console.log(bst.ceiling(55)); // undefined;
|
|
950
1496
|
*/
|
|
951
1497
|
ceiling(
|
|
952
1498
|
keyNodeEntryOrPredicate:
|
|
@@ -1012,6 +1558,43 @@ export class BST<K = any, V = any, R = any> extends BinaryTree<K, V, R> implemen
|
|
|
1012
1558
|
* Equivalent to Java TreeMap.higher.
|
|
1013
1559
|
* Time Complexity: O(log n) average, O(h) worst case.
|
|
1014
1560
|
* Space Complexity: O(h) for recursion, O(1) for iteration.
|
|
1561
|
+
|
|
1562
|
+
|
|
1563
|
+
|
|
1564
|
+
|
|
1565
|
+
|
|
1566
|
+
|
|
1567
|
+
|
|
1568
|
+
|
|
1569
|
+
|
|
1570
|
+
|
|
1571
|
+
|
|
1572
|
+
|
|
1573
|
+
|
|
1574
|
+
|
|
1575
|
+
|
|
1576
|
+
|
|
1577
|
+
|
|
1578
|
+
|
|
1579
|
+
|
|
1580
|
+
|
|
1581
|
+
|
|
1582
|
+
|
|
1583
|
+
|
|
1584
|
+
|
|
1585
|
+
|
|
1586
|
+
|
|
1587
|
+
|
|
1588
|
+
|
|
1589
|
+
|
|
1590
|
+
|
|
1591
|
+
|
|
1592
|
+
|
|
1593
|
+
* @example
|
|
1594
|
+
* // Find the least key strictly > target
|
|
1595
|
+
* const bst = new BST<number>([10, 20, 30, 40]);
|
|
1596
|
+
* console.log(bst.higher(20)); // 30;
|
|
1597
|
+
* console.log(bst.higher(40)); // undefined;
|
|
1015
1598
|
*/
|
|
1016
1599
|
higher(
|
|
1017
1600
|
keyNodeEntryOrPredicate:
|
|
@@ -1077,6 +1660,44 @@ export class BST<K = any, V = any, R = any> extends BinaryTree<K, V, R> implemen
|
|
|
1077
1660
|
* Equivalent to Java TreeMap.floor.
|
|
1078
1661
|
* Time Complexity: O(log n) average, O(h) worst case.
|
|
1079
1662
|
* Space Complexity: O(h) for recursion, O(1) for iteration.
|
|
1663
|
+
|
|
1664
|
+
|
|
1665
|
+
|
|
1666
|
+
|
|
1667
|
+
|
|
1668
|
+
|
|
1669
|
+
|
|
1670
|
+
|
|
1671
|
+
|
|
1672
|
+
|
|
1673
|
+
|
|
1674
|
+
|
|
1675
|
+
|
|
1676
|
+
|
|
1677
|
+
|
|
1678
|
+
|
|
1679
|
+
|
|
1680
|
+
|
|
1681
|
+
|
|
1682
|
+
|
|
1683
|
+
|
|
1684
|
+
|
|
1685
|
+
|
|
1686
|
+
|
|
1687
|
+
|
|
1688
|
+
|
|
1689
|
+
|
|
1690
|
+
|
|
1691
|
+
|
|
1692
|
+
|
|
1693
|
+
|
|
1694
|
+
|
|
1695
|
+
* @example
|
|
1696
|
+
* // Find the greatest key ≤ target
|
|
1697
|
+
* const bst = new BST<number>([10, 20, 30, 40, 50]);
|
|
1698
|
+
* console.log(bst.floor(25)); // 20;
|
|
1699
|
+
* console.log(bst.floor(10)); // 10;
|
|
1700
|
+
* console.log(bst.floor(5)); // undefined;
|
|
1080
1701
|
*/
|
|
1081
1702
|
floor(
|
|
1082
1703
|
keyNodeEntryOrPredicate:
|
|
@@ -1117,7 +1738,7 @@ export class BST<K = any, V = any, R = any> extends BinaryTree<K, V, R> implemen
|
|
|
1117
1738
|
iterationType?: IterationType
|
|
1118
1739
|
): K | undefined | ReturnType<C> {
|
|
1119
1740
|
if (keyNodeEntryOrPredicate === null || keyNodeEntryOrPredicate === undefined) {
|
|
1120
|
-
if (typeof callback === 'string' || !callback) {
|
|
1741
|
+
/* istanbul ignore next */ if (typeof callback === 'string' || !callback) {
|
|
1121
1742
|
return undefined;
|
|
1122
1743
|
}
|
|
1123
1744
|
return undefined;
|
|
@@ -1151,7 +1772,7 @@ export class BST<K = any, V = any, R = any> extends BinaryTree<K, V, R> implemen
|
|
|
1151
1772
|
} else if (this.isEntry(keyNodeEntryOrPredicate)) {
|
|
1152
1773
|
const key = keyNodeEntryOrPredicate[0];
|
|
1153
1774
|
if (key === null || key === undefined) {
|
|
1154
|
-
if (typeof callback === 'string' || !callback) {
|
|
1775
|
+
/* istanbul ignore next */ if (typeof callback === 'string' || !callback) {
|
|
1155
1776
|
return undefined;
|
|
1156
1777
|
}
|
|
1157
1778
|
return undefined;
|
|
@@ -1164,6 +1785,7 @@ export class BST<K = any, V = any, R = any> extends BinaryTree<K, V, R> implemen
|
|
|
1164
1785
|
if (targetKey !== undefined) {
|
|
1165
1786
|
const node = this._floorByKey(targetKey, actualIterationType);
|
|
1166
1787
|
|
|
1788
|
+
/* istanbul ignore next */
|
|
1167
1789
|
if (!actualCallback) {
|
|
1168
1790
|
return node?.key;
|
|
1169
1791
|
}
|
|
@@ -1171,9 +1793,11 @@ export class BST<K = any, V = any, R = any> extends BinaryTree<K, V, R> implemen
|
|
|
1171
1793
|
return node ? actualCallback(node) : undefined;
|
|
1172
1794
|
}
|
|
1173
1795
|
|
|
1796
|
+
/* istanbul ignore next -- targetKey is always defined if we reach here (null/undefined caught above) */
|
|
1174
1797
|
if (typeof callback === 'string' || !callback) {
|
|
1175
1798
|
return undefined;
|
|
1176
1799
|
}
|
|
1800
|
+
/* istanbul ignore next */
|
|
1177
1801
|
return undefined;
|
|
1178
1802
|
}
|
|
1179
1803
|
|
|
@@ -1182,6 +1806,43 @@ export class BST<K = any, V = any, R = any> extends BinaryTree<K, V, R> implemen
|
|
|
1182
1806
|
* Equivalent to Java TreeMap.lower.
|
|
1183
1807
|
* Time Complexity: O(log n) average, O(h) worst case.
|
|
1184
1808
|
* Space Complexity: O(h) for recursion, O(1) for iteration.
|
|
1809
|
+
|
|
1810
|
+
|
|
1811
|
+
|
|
1812
|
+
|
|
1813
|
+
|
|
1814
|
+
|
|
1815
|
+
|
|
1816
|
+
|
|
1817
|
+
|
|
1818
|
+
|
|
1819
|
+
|
|
1820
|
+
|
|
1821
|
+
|
|
1822
|
+
|
|
1823
|
+
|
|
1824
|
+
|
|
1825
|
+
|
|
1826
|
+
|
|
1827
|
+
|
|
1828
|
+
|
|
1829
|
+
|
|
1830
|
+
|
|
1831
|
+
|
|
1832
|
+
|
|
1833
|
+
|
|
1834
|
+
|
|
1835
|
+
|
|
1836
|
+
|
|
1837
|
+
|
|
1838
|
+
|
|
1839
|
+
|
|
1840
|
+
|
|
1841
|
+
* @example
|
|
1842
|
+
* // Find the greatest key strictly < target
|
|
1843
|
+
* const bst = new BST<number>([10, 20, 30, 40]);
|
|
1844
|
+
* console.log(bst.lower(30)); // 20;
|
|
1845
|
+
* console.log(bst.lower(10)); // undefined;
|
|
1185
1846
|
*/
|
|
1186
1847
|
lower(
|
|
1187
1848
|
keyNodeEntryOrPredicate:
|
|
@@ -1222,9 +1883,10 @@ export class BST<K = any, V = any, R = any> extends BinaryTree<K, V, R> implemen
|
|
|
1222
1883
|
iterationType?: IterationType
|
|
1223
1884
|
): K | undefined | ReturnType<C> {
|
|
1224
1885
|
if (keyNodeEntryOrPredicate === null || keyNodeEntryOrPredicate === undefined) {
|
|
1225
|
-
if (typeof callback === 'string' || !callback) {
|
|
1886
|
+
/* istanbul ignore next */ if (typeof callback === 'string' || !callback) {
|
|
1226
1887
|
return undefined;
|
|
1227
1888
|
}
|
|
1889
|
+
/* istanbul ignore next */
|
|
1228
1890
|
return undefined;
|
|
1229
1891
|
}
|
|
1230
1892
|
|
|
@@ -1256,9 +1918,10 @@ export class BST<K = any, V = any, R = any> extends BinaryTree<K, V, R> implemen
|
|
|
1256
1918
|
} else if (this.isEntry(keyNodeEntryOrPredicate)) {
|
|
1257
1919
|
const key = keyNodeEntryOrPredicate[0];
|
|
1258
1920
|
if (key === null || key === undefined) {
|
|
1259
|
-
if (typeof callback === 'string' || !callback) {
|
|
1921
|
+
/* istanbul ignore next */ if (typeof callback === 'string' || !callback) {
|
|
1260
1922
|
return undefined;
|
|
1261
1923
|
}
|
|
1924
|
+
/* istanbul ignore next */
|
|
1262
1925
|
return undefined;
|
|
1263
1926
|
}
|
|
1264
1927
|
targetKey = key;
|
|
@@ -1276,9 +1939,11 @@ export class BST<K = any, V = any, R = any> extends BinaryTree<K, V, R> implemen
|
|
|
1276
1939
|
return node ? actualCallback(node) : undefined;
|
|
1277
1940
|
}
|
|
1278
1941
|
|
|
1942
|
+
/* istanbul ignore next -- targetKey is always defined if we reach here (null/undefined caught above) */
|
|
1279
1943
|
if (typeof callback === 'string' || !callback) {
|
|
1280
1944
|
return undefined;
|
|
1281
1945
|
}
|
|
1946
|
+
/* istanbul ignore next */
|
|
1282
1947
|
return undefined;
|
|
1283
1948
|
}
|
|
1284
1949
|
|
|
@@ -1345,6 +2010,44 @@ export class BST<K = any, V = any, R = any> extends BinaryTree<K, V, R> implemen
|
|
|
1345
2010
|
*
|
|
1346
2011
|
* @param [iterationType=this.iterationType] - The traversal method for the initial node export.
|
|
1347
2012
|
* @returns True if successful, false if the tree was empty.
|
|
2013
|
+
|
|
2014
|
+
|
|
2015
|
+
|
|
2016
|
+
|
|
2017
|
+
|
|
2018
|
+
|
|
2019
|
+
|
|
2020
|
+
|
|
2021
|
+
|
|
2022
|
+
|
|
2023
|
+
|
|
2024
|
+
|
|
2025
|
+
|
|
2026
|
+
|
|
2027
|
+
|
|
2028
|
+
|
|
2029
|
+
|
|
2030
|
+
|
|
2031
|
+
|
|
2032
|
+
|
|
2033
|
+
|
|
2034
|
+
|
|
2035
|
+
|
|
2036
|
+
|
|
2037
|
+
|
|
2038
|
+
|
|
2039
|
+
|
|
2040
|
+
|
|
2041
|
+
|
|
2042
|
+
|
|
2043
|
+
* @example
|
|
2044
|
+
* // Rebalance the tree
|
|
2045
|
+
* const bst = new BST<number>();
|
|
2046
|
+
* // Insert in sorted order (worst case for BST)
|
|
2047
|
+
* for (let i = 1; i <= 7; i++) bst.add(i);
|
|
2048
|
+
* console.log(bst.isAVLBalanced()); // false;
|
|
2049
|
+
* bst.perfectlyBalance();
|
|
2050
|
+
* console.log(bst.isAVLBalanced()); // true;
|
|
1348
2051
|
*/
|
|
1349
2052
|
perfectlyBalance(iterationType: IterationType = this.iterationType): boolean {
|
|
1350
2053
|
const nodes = this.dfs(node => node, 'IN', false, this._root, iterationType);
|
|
@@ -1377,6 +2080,40 @@ export class BST<K = any, V = any, R = any> extends BinaryTree<K, V, R> implemen
|
|
|
1377
2080
|
*
|
|
1378
2081
|
* @param [iterationType=this.iterationType] - The traversal method.
|
|
1379
2082
|
* @returns True if the tree is AVL balanced, false otherwise.
|
|
2083
|
+
|
|
2084
|
+
|
|
2085
|
+
|
|
2086
|
+
|
|
2087
|
+
|
|
2088
|
+
|
|
2089
|
+
|
|
2090
|
+
|
|
2091
|
+
|
|
2092
|
+
|
|
2093
|
+
|
|
2094
|
+
|
|
2095
|
+
|
|
2096
|
+
|
|
2097
|
+
|
|
2098
|
+
|
|
2099
|
+
|
|
2100
|
+
|
|
2101
|
+
|
|
2102
|
+
|
|
2103
|
+
|
|
2104
|
+
|
|
2105
|
+
|
|
2106
|
+
|
|
2107
|
+
|
|
2108
|
+
|
|
2109
|
+
|
|
2110
|
+
|
|
2111
|
+
|
|
2112
|
+
|
|
2113
|
+
* @example
|
|
2114
|
+
* // Check if tree is height-balanced
|
|
2115
|
+
* const bst = new BST<number>([3, 1, 5, 2, 4]);
|
|
2116
|
+
* console.log(bst.isAVLBalanced()); // true;
|
|
1380
2117
|
*/
|
|
1381
2118
|
isAVLBalanced(iterationType: IterationType = this.iterationType): boolean {
|
|
1382
2119
|
if (!this._root) return true;
|
|
@@ -1434,6 +2171,72 @@ export class BST<K = any, V = any, R = any> extends BinaryTree<K, V, R> implemen
|
|
|
1434
2171
|
* @param [options] - Options for the new BST.
|
|
1435
2172
|
* @param [thisArg] - `this` context for the callback.
|
|
1436
2173
|
* @returns A new, mapped BST.
|
|
2174
|
+
|
|
2175
|
+
|
|
2176
|
+
|
|
2177
|
+
|
|
2178
|
+
|
|
2179
|
+
|
|
2180
|
+
|
|
2181
|
+
|
|
2182
|
+
|
|
2183
|
+
|
|
2184
|
+
|
|
2185
|
+
|
|
2186
|
+
|
|
2187
|
+
|
|
2188
|
+
|
|
2189
|
+
|
|
2190
|
+
|
|
2191
|
+
|
|
2192
|
+
|
|
2193
|
+
|
|
2194
|
+
|
|
2195
|
+
|
|
2196
|
+
|
|
2197
|
+
|
|
2198
|
+
|
|
2199
|
+
|
|
2200
|
+
|
|
2201
|
+
|
|
2202
|
+
|
|
2203
|
+
|
|
2204
|
+
|
|
2205
|
+
|
|
2206
|
+
|
|
2207
|
+
|
|
2208
|
+
|
|
2209
|
+
|
|
2210
|
+
|
|
2211
|
+
|
|
2212
|
+
|
|
2213
|
+
|
|
2214
|
+
|
|
2215
|
+
|
|
2216
|
+
|
|
2217
|
+
|
|
2218
|
+
|
|
2219
|
+
|
|
2220
|
+
|
|
2221
|
+
|
|
2222
|
+
|
|
2223
|
+
|
|
2224
|
+
|
|
2225
|
+
|
|
2226
|
+
|
|
2227
|
+
|
|
2228
|
+
|
|
2229
|
+
|
|
2230
|
+
|
|
2231
|
+
|
|
2232
|
+
|
|
2233
|
+
|
|
2234
|
+
|
|
2235
|
+
* @example
|
|
2236
|
+
* // Transform to new tree
|
|
2237
|
+
* const bst = new BST<number, number>([[1, 10], [2, 20], [3, 30]]);
|
|
2238
|
+
* const doubled = bst.map((value, key) => [key, (value ?? 0) * 2] as [number, number]);
|
|
2239
|
+
* console.log([...doubled.values()]); // [20, 40, 60];
|
|
1437
2240
|
*/
|
|
1438
2241
|
override map<MK = K, MV = V, MR = any>(
|
|
1439
2242
|
callback: EntryCallback<K, V | undefined, [MK, MV]>,
|
|
@@ -1523,6 +2326,7 @@ export class BST<K = any, V = any, R = any> extends BinaryTree<K, V, R> implemen
|
|
|
1523
2326
|
return 0;
|
|
1524
2327
|
}
|
|
1525
2328
|
|
|
2329
|
+
/* istanbul ignore next -- Date objects satisfy isComparable(), so this branch is unreachable via default comparator */
|
|
1526
2330
|
// Date keys: compare by getTime()
|
|
1527
2331
|
if (a instanceof Date && b instanceof Date) {
|
|
1528
2332
|
const ta = a.getTime();
|
|
@@ -1831,6 +2635,7 @@ export class BST<K = any, V = any, R = any> extends BinaryTree<K, V, R> implemen
|
|
|
1831
2635
|
return this._boundByKey(targetKey, isLower, iterationType);
|
|
1832
2636
|
}
|
|
1833
2637
|
|
|
2638
|
+
/* istanbul ignore next -- defensive: targetKey is always defined if predicate path was skipped */
|
|
1834
2639
|
return undefined;
|
|
1835
2640
|
}
|
|
1836
2641
|
|