data-structure-typed 1.54.2 → 2.0.0
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/LICENSE +2 -2
- package/README.md +14 -1
- package/README_zh-CN.md +1 -1
- package/benchmark/report.html +28 -1
- package/benchmark/report.json +327 -18
- package/dist/cjs/data-structures/base/iterable-element-base.d.ts +14 -40
- package/dist/cjs/data-structures/base/iterable-element-base.js +14 -11
- package/dist/cjs/data-structures/base/iterable-element-base.js.map +1 -1
- package/dist/cjs/data-structures/base/linear-base.d.ts +277 -0
- package/dist/cjs/data-structures/base/linear-base.js +553 -0
- package/dist/cjs/data-structures/base/linear-base.js.map +1 -0
- package/dist/cjs/data-structures/binary-tree/avl-tree-counter.d.ts +21 -20
- package/dist/cjs/data-structures/binary-tree/avl-tree-counter.js +8 -7
- package/dist/cjs/data-structures/binary-tree/avl-tree-counter.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +23 -19
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js +51 -38
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +89 -21
- package/dist/cjs/data-structures/binary-tree/avl-tree.js +76 -8
- package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +173 -225
- package/dist/cjs/data-structures/binary-tree/binary-tree.js +244 -149
- package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/bst.d.ts +62 -56
- package/dist/cjs/data-structures/binary-tree/bst.js +89 -133
- package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/red-black-tree.d.ts +19 -25
- package/dist/cjs/data-structures/binary-tree/red-black-tree.js +7 -13
- package/dist/cjs/data-structures/binary-tree/red-black-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/tree-counter.d.ts +19 -19
- package/dist/cjs/data-structures/binary-tree/tree-counter.js +12 -12
- package/dist/cjs/data-structures/binary-tree/tree-counter.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.d.ts +186 -25
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.js +211 -41
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.js.map +1 -1
- package/dist/cjs/data-structures/graph/abstract-graph.js +2 -2
- package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
- package/dist/cjs/data-structures/heap/heap.d.ts +3 -11
- package/dist/cjs/data-structures/heap/heap.js +0 -10
- package/dist/cjs/data-structures/heap/heap.js.map +1 -1
- package/dist/cjs/data-structures/heap/max-heap.d.ts +2 -2
- package/dist/cjs/data-structures/heap/max-heap.js.map +1 -1
- package/dist/cjs/data-structures/heap/min-heap.d.ts +2 -2
- package/dist/cjs/data-structures/heap/min-heap.js.map +1 -1
- package/dist/cjs/data-structures/linked-list/doubly-linked-list.d.ts +65 -94
- package/dist/cjs/data-structures/linked-list/doubly-linked-list.js +131 -146
- package/dist/cjs/data-structures/linked-list/doubly-linked-list.js.map +1 -1
- package/dist/cjs/data-structures/linked-list/singly-linked-list.d.ts +79 -75
- package/dist/cjs/data-structures/linked-list/singly-linked-list.js +217 -169
- package/dist/cjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
- package/dist/cjs/data-structures/priority-queue/max-priority-queue.d.ts +2 -2
- package/dist/cjs/data-structures/priority-queue/max-priority-queue.js.map +1 -1
- package/dist/cjs/data-structures/priority-queue/min-priority-queue.d.ts +2 -2
- package/dist/cjs/data-structures/priority-queue/min-priority-queue.js.map +1 -1
- package/dist/cjs/data-structures/priority-queue/priority-queue.d.ts +2 -2
- package/dist/cjs/data-structures/priority-queue/priority-queue.js.map +1 -1
- package/dist/cjs/data-structures/queue/deque.d.ts +130 -91
- package/dist/cjs/data-structures/queue/deque.js +269 -169
- package/dist/cjs/data-structures/queue/deque.js.map +1 -1
- package/dist/cjs/data-structures/queue/queue.d.ts +84 -40
- package/dist/cjs/data-structures/queue/queue.js +134 -50
- package/dist/cjs/data-structures/queue/queue.js.map +1 -1
- package/dist/cjs/data-structures/stack/stack.d.ts +3 -11
- package/dist/cjs/data-structures/stack/stack.js +0 -10
- package/dist/cjs/data-structures/stack/stack.js.map +1 -1
- package/dist/cjs/data-structures/trie/trie.d.ts +4 -3
- package/dist/cjs/data-structures/trie/trie.js +3 -0
- package/dist/cjs/data-structures/trie/trie.js.map +1 -1
- package/dist/cjs/types/data-structures/base/base.d.ts +9 -4
- package/dist/cjs/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +1 -1
- package/dist/cjs/types/data-structures/binary-tree/binary-tree.d.ts +1 -0
- package/dist/cjs/types/data-structures/binary-tree/bst.d.ts +1 -1
- package/dist/cjs/types/data-structures/binary-tree/tree-multi-map.d.ts +1 -1
- package/dist/cjs/types/data-structures/linked-list/doubly-linked-list.d.ts +2 -2
- package/dist/cjs/types/data-structures/linked-list/singly-linked-list.d.ts +2 -2
- package/dist/cjs/types/data-structures/queue/deque.d.ts +2 -3
- package/dist/cjs/types/data-structures/queue/queue.d.ts +2 -2
- package/dist/cjs/utils/utils.d.ts +2 -2
- package/dist/esm/data-structures/base/iterable-element-base.d.ts +14 -40
- package/dist/esm/data-structures/base/iterable-element-base.js +14 -11
- package/dist/esm/data-structures/base/iterable-element-base.js.map +1 -1
- package/dist/esm/data-structures/base/linear-base.d.ts +277 -0
- package/dist/esm/data-structures/base/linear-base.js +549 -0
- package/dist/esm/data-structures/base/linear-base.js.map +1 -0
- package/dist/esm/data-structures/binary-tree/avl-tree-counter.d.ts +21 -20
- package/dist/esm/data-structures/binary-tree/avl-tree-counter.js +9 -8
- package/dist/esm/data-structures/binary-tree/avl-tree-counter.js.map +1 -1
- package/dist/esm/data-structures/binary-tree/avl-tree-multi-map.d.ts +23 -19
- package/dist/esm/data-structures/binary-tree/avl-tree-multi-map.js +52 -38
- package/dist/esm/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -1
- package/dist/esm/data-structures/binary-tree/avl-tree.d.ts +89 -21
- package/dist/esm/data-structures/binary-tree/avl-tree.js +77 -9
- package/dist/esm/data-structures/binary-tree/avl-tree.js.map +1 -1
- package/dist/esm/data-structures/binary-tree/binary-tree.d.ts +173 -225
- package/dist/esm/data-structures/binary-tree/binary-tree.js +248 -153
- package/dist/esm/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/esm/data-structures/binary-tree/bst.d.ts +62 -56
- package/dist/esm/data-structures/binary-tree/bst.js +90 -132
- package/dist/esm/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/esm/data-structures/binary-tree/red-black-tree.d.ts +19 -25
- package/dist/esm/data-structures/binary-tree/red-black-tree.js +8 -14
- package/dist/esm/data-structures/binary-tree/red-black-tree.js.map +1 -1
- package/dist/esm/data-structures/binary-tree/tree-counter.d.ts +19 -19
- package/dist/esm/data-structures/binary-tree/tree-counter.js +13 -13
- package/dist/esm/data-structures/binary-tree/tree-counter.js.map +1 -1
- package/dist/esm/data-structures/binary-tree/tree-multi-map.d.ts +186 -25
- package/dist/esm/data-structures/binary-tree/tree-multi-map.js +212 -41
- package/dist/esm/data-structures/binary-tree/tree-multi-map.js.map +1 -1
- package/dist/esm/data-structures/graph/abstract-graph.js +2 -2
- package/dist/esm/data-structures/graph/abstract-graph.js.map +1 -1
- package/dist/esm/data-structures/heap/heap.d.ts +3 -11
- package/dist/esm/data-structures/heap/heap.js +0 -10
- package/dist/esm/data-structures/heap/heap.js.map +1 -1
- package/dist/esm/data-structures/heap/max-heap.d.ts +2 -2
- package/dist/esm/data-structures/heap/max-heap.js.map +1 -1
- package/dist/esm/data-structures/heap/min-heap.d.ts +2 -2
- package/dist/esm/data-structures/heap/min-heap.js.map +1 -1
- package/dist/esm/data-structures/linked-list/doubly-linked-list.d.ts +65 -94
- package/dist/esm/data-structures/linked-list/doubly-linked-list.js +132 -148
- package/dist/esm/data-structures/linked-list/doubly-linked-list.js.map +1 -1
- package/dist/esm/data-structures/linked-list/singly-linked-list.d.ts +79 -75
- package/dist/esm/data-structures/linked-list/singly-linked-list.js +217 -170
- package/dist/esm/data-structures/linked-list/singly-linked-list.js.map +1 -1
- package/dist/esm/data-structures/priority-queue/max-priority-queue.d.ts +2 -2
- package/dist/esm/data-structures/priority-queue/max-priority-queue.js.map +1 -1
- package/dist/esm/data-structures/priority-queue/min-priority-queue.d.ts +2 -2
- package/dist/esm/data-structures/priority-queue/min-priority-queue.js.map +1 -1
- package/dist/esm/data-structures/priority-queue/priority-queue.d.ts +2 -2
- package/dist/esm/data-structures/priority-queue/priority-queue.js.map +1 -1
- package/dist/esm/data-structures/queue/deque.d.ts +130 -91
- package/dist/esm/data-structures/queue/deque.js +269 -169
- package/dist/esm/data-structures/queue/deque.js.map +1 -1
- package/dist/esm/data-structures/queue/queue.d.ts +84 -40
- package/dist/esm/data-structures/queue/queue.js +135 -51
- package/dist/esm/data-structures/queue/queue.js.map +1 -1
- package/dist/esm/data-structures/stack/stack.d.ts +3 -11
- package/dist/esm/data-structures/stack/stack.js +0 -10
- package/dist/esm/data-structures/stack/stack.js.map +1 -1
- package/dist/esm/data-structures/trie/trie.d.ts +4 -3
- package/dist/esm/data-structures/trie/trie.js +3 -0
- package/dist/esm/data-structures/trie/trie.js.map +1 -1
- package/dist/esm/types/data-structures/base/base.d.ts +9 -4
- package/dist/esm/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +1 -1
- package/dist/esm/types/data-structures/binary-tree/binary-tree.d.ts +1 -0
- package/dist/esm/types/data-structures/binary-tree/bst.d.ts +1 -1
- package/dist/esm/types/data-structures/binary-tree/tree-multi-map.d.ts +1 -1
- package/dist/esm/types/data-structures/linked-list/doubly-linked-list.d.ts +2 -2
- package/dist/esm/types/data-structures/linked-list/singly-linked-list.d.ts +2 -2
- package/dist/esm/types/data-structures/queue/deque.d.ts +2 -3
- package/dist/esm/types/data-structures/queue/queue.d.ts +2 -2
- package/dist/esm/utils/utils.d.ts +2 -2
- package/dist/umd/data-structure-typed.js +1548 -920
- package/dist/umd/data-structure-typed.min.js +5 -12
- package/dist/umd/data-structure-typed.min.js.map +1 -1
- package/package.json +7 -7
- package/src/data-structures/base/iterable-element-base.ts +29 -20
- package/src/data-structures/base/linear-base.ts +649 -0
- package/src/data-structures/binary-tree/avl-tree-counter.ts +30 -23
- package/src/data-structures/binary-tree/avl-tree-multi-map.ts +74 -49
- package/src/data-structures/binary-tree/avl-tree.ts +99 -29
- package/src/data-structures/binary-tree/binary-tree.ts +474 -257
- package/src/data-structures/binary-tree/bst.ts +150 -152
- package/src/data-structures/binary-tree/red-black-tree.ts +27 -35
- package/src/data-structures/binary-tree/tree-counter.ts +33 -27
- package/src/data-structures/binary-tree/tree-multi-map.ts +235 -53
- package/src/data-structures/graph/abstract-graph.ts +2 -2
- package/src/data-structures/heap/heap.ts +3 -14
- package/src/data-structures/heap/max-heap.ts +2 -2
- package/src/data-structures/heap/min-heap.ts +2 -2
- package/src/data-structures/linked-list/doubly-linked-list.ts +144 -160
- package/src/data-structures/linked-list/singly-linked-list.ts +241 -185
- package/src/data-structures/priority-queue/max-priority-queue.ts +2 -5
- package/src/data-structures/priority-queue/min-priority-queue.ts +2 -5
- package/src/data-structures/priority-queue/priority-queue.ts +2 -2
- package/src/data-structures/queue/deque.ts +286 -183
- package/src/data-structures/queue/queue.ts +149 -63
- package/src/data-structures/stack/stack.ts +3 -18
- package/src/data-structures/trie/trie.ts +7 -3
- package/src/types/data-structures/base/base.ts +17 -8
- package/src/types/data-structures/binary-tree/avl-tree-multi-map.ts +1 -1
- package/src/types/data-structures/binary-tree/binary-tree.ts +1 -0
- package/src/types/data-structures/binary-tree/bst.ts +1 -1
- package/src/types/data-structures/binary-tree/tree-multi-map.ts +1 -1
- package/src/types/data-structures/linked-list/doubly-linked-list.ts +2 -2
- package/src/types/data-structures/linked-list/singly-linked-list.ts +2 -2
- package/src/types/data-structures/queue/deque.ts +2 -3
- package/src/types/data-structures/queue/queue.ts +2 -2
- package/src/utils/utils.ts +2 -2
- package/test/integration/all-in-one.test.ts +1 -1
- package/test/integration/avl-tree.test.ts +1 -1
- package/test/integration/bst.test.ts +2 -2
- package/test/integration/compile.mjs +21 -21
- package/test/performance/data-structures/binary-tree/avl-tree.test.mjs +71 -0
- package/test/performance/data-structures/binary-tree/red-black-tree.test.mjs +81 -0
- package/test/performance/{reportor.js → reportor.mjs} +264 -8
- package/test/performance/reportor.ts +1 -1
- package/test/unit/data-structures/binary-tree/avl-tree-counter.test.ts +7 -7
- package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +172 -5
- package/test/unit/data-structures/binary-tree/avl-tree.test.ts +72 -4
- package/test/unit/data-structures/binary-tree/binary-tree.test.ts +132 -82
- package/test/unit/data-structures/binary-tree/bst.test.ts +12 -12
- package/test/unit/data-structures/binary-tree/red-black-tree.test.ts +5 -13
- package/test/unit/data-structures/binary-tree/tree-counter.test.ts +4 -4
- package/test/unit/data-structures/binary-tree/tree-multi-map.test.ts +168 -10
- package/test/unit/data-structures/linked-list/doubly-linked-list.test.ts +135 -27
- package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +111 -11
- package/test/unit/data-structures/queue/deque.test.ts +241 -60
- package/test/unit/data-structures/queue/queue.test.ts +118 -19
- package/test/unit/unrestricted-interconversion.test.ts +1 -1
- package/test/utils/json2html.ts +0 -154
- package/test/performance/data-structures/binary-tree/avl-tree.test.js +0 -45
- /package/test/performance/data-structures/binary-tree/{rb-tree.test.ts → red-black-tree.test.ts} +0 -0
|
@@ -50,7 +50,7 @@ describe('AVLTreeMultiMap Test', () => {
|
|
|
50
50
|
expect(getMinNodeBySpecificNode?.key).toBe(12);
|
|
51
51
|
|
|
52
52
|
let subTreeSum = 0;
|
|
53
|
-
if (node15) avlTmm.dfs(node => (subTreeSum += node.key), 'PRE', node15);
|
|
53
|
+
if (node15) avlTmm.dfs(node => (subTreeSum += node.key), 'PRE', false, node15);
|
|
54
54
|
expect(subTreeSum).toBe(70);
|
|
55
55
|
|
|
56
56
|
let lesserSum = 0;
|
|
@@ -176,7 +176,7 @@ describe('AVLTreeMultiMap Test recursively', () => {
|
|
|
176
176
|
expect(getMinNodeBySpecificNode?.key).toBe(12);
|
|
177
177
|
|
|
178
178
|
let subTreeSum = 0;
|
|
179
|
-
if (node15) avlTmm.dfs(node => (subTreeSum += node.key), 'PRE', node15);
|
|
179
|
+
if (node15) avlTmm.dfs(node => (subTreeSum += node.key), 'PRE', false, node15);
|
|
180
180
|
expect(subTreeSum).toBe(70);
|
|
181
181
|
|
|
182
182
|
let lesserSum = 0;
|
|
@@ -509,7 +509,7 @@ describe('AVLTreeMultiMap not map mode', () => {
|
|
|
509
509
|
expect(getMinNodeBySpecificNode?.key).toBe(12);
|
|
510
510
|
|
|
511
511
|
let subTreeSum = 0;
|
|
512
|
-
if (node15) avlTmm.dfs(node => (subTreeSum += node.key), 'PRE', node15);
|
|
512
|
+
if (node15) avlTmm.dfs(node => (subTreeSum += node.key), 'PRE', false, node15);
|
|
513
513
|
expect(subTreeSum).toBe(70);
|
|
514
514
|
|
|
515
515
|
let lesserSum = 0;
|
|
@@ -527,7 +527,6 @@ describe('AVLTreeMultiMap not map mode test recursively', () => {
|
|
|
527
527
|
const avlTmm = new AVLTreeMultiMap<number>([], { iterationType: 'RECURSIVE' });
|
|
528
528
|
|
|
529
529
|
for (const i of arr) avlTmm.add([i, [i]]);
|
|
530
|
-
|
|
531
530
|
const node6 = avlTmm.getNode(6);
|
|
532
531
|
|
|
533
532
|
expect(node6 && avlTmm.getHeight(node6)).toBe(3);
|
|
@@ -544,7 +543,7 @@ describe('AVLTreeMultiMap not map mode test recursively', () => {
|
|
|
544
543
|
expect(getMinNodeBySpecificNode?.key).toBe(12);
|
|
545
544
|
|
|
546
545
|
let subTreeSum = 0;
|
|
547
|
-
if (node15) avlTmm.dfs(node => (subTreeSum += node.key), 'PRE', node15);
|
|
546
|
+
if (node15) avlTmm.dfs(node => (subTreeSum += node.key), 'PRE', false, node15);
|
|
548
547
|
expect(subTreeSum).toBe(70);
|
|
549
548
|
|
|
550
549
|
let lesserSum = 0;
|
|
@@ -571,3 +570,171 @@ describe('AVLTreeMultiMap iterative methods not map mode', () => {
|
|
|
571
570
|
expect(cloned.get(cloned.root?.right?.key)).toEqual(['c']);
|
|
572
571
|
});
|
|
573
572
|
});
|
|
573
|
+
|
|
574
|
+
describe('classic use', () => {
|
|
575
|
+
// Test suite for TreeMultiMap with player ranking and equipment
|
|
576
|
+
it('players ranked by score with their equipment', () => {
|
|
577
|
+
type Equipment = {
|
|
578
|
+
name: string; // Equipment name
|
|
579
|
+
quality: 'legendary' | 'epic' | 'rare' | 'common';
|
|
580
|
+
level: number;
|
|
581
|
+
};
|
|
582
|
+
|
|
583
|
+
type Player = {
|
|
584
|
+
name: string;
|
|
585
|
+
score: number;
|
|
586
|
+
equipments: Equipment[];
|
|
587
|
+
};
|
|
588
|
+
|
|
589
|
+
// Mock player data with their scores and equipment
|
|
590
|
+
const players: Player[] = [
|
|
591
|
+
{
|
|
592
|
+
name: 'DragonSlayer',
|
|
593
|
+
score: 8750,
|
|
594
|
+
equipments: [
|
|
595
|
+
{ name: 'AWM', quality: 'legendary', level: 85 },
|
|
596
|
+
{ name: 'Level 3 Helmet', quality: 'epic', level: 80 },
|
|
597
|
+
{ name: 'Extended Quickdraw Mag', quality: 'rare', level: 75 },
|
|
598
|
+
{ name: 'Compensator', quality: 'epic', level: 78 },
|
|
599
|
+
{ name: 'Vertical Grip', quality: 'rare', level: 72 }
|
|
600
|
+
]
|
|
601
|
+
},
|
|
602
|
+
{
|
|
603
|
+
name: 'ShadowNinja',
|
|
604
|
+
score: 7200,
|
|
605
|
+
equipments: [
|
|
606
|
+
{ name: 'M416', quality: 'epic', level: 75 },
|
|
607
|
+
{ name: 'Ghillie Suit', quality: 'rare', level: 70 },
|
|
608
|
+
{ name: 'Red Dot Sight', quality: 'common', level: 65 },
|
|
609
|
+
{ name: 'Extended QuickDraw Mag', quality: 'rare', level: 68 }
|
|
610
|
+
]
|
|
611
|
+
},
|
|
612
|
+
{
|
|
613
|
+
name: 'RuneMaster',
|
|
614
|
+
score: 9100,
|
|
615
|
+
equipments: [
|
|
616
|
+
{ name: 'KAR98K', quality: 'legendary', level: 90 },
|
|
617
|
+
{ name: 'Level 3 Vest', quality: 'legendary', level: 85 },
|
|
618
|
+
{ name: 'Holographic Sight', quality: 'epic', level: 82 },
|
|
619
|
+
{ name: 'Suppressor', quality: 'legendary', level: 88 },
|
|
620
|
+
{ name: 'Level 3 Backpack', quality: 'epic', level: 80 }
|
|
621
|
+
]
|
|
622
|
+
},
|
|
623
|
+
{
|
|
624
|
+
name: 'BattleKing',
|
|
625
|
+
score: 8500,
|
|
626
|
+
equipments: [
|
|
627
|
+
{ name: 'AUG', quality: 'epic', level: 82 },
|
|
628
|
+
{ name: 'Red Dot Sight', quality: 'rare', level: 75 },
|
|
629
|
+
{ name: 'Extended Mag', quality: 'common', level: 70 },
|
|
630
|
+
{ name: 'Tactical Stock', quality: 'rare', level: 76 }
|
|
631
|
+
]
|
|
632
|
+
},
|
|
633
|
+
{
|
|
634
|
+
name: 'SniperElite',
|
|
635
|
+
score: 7800,
|
|
636
|
+
equipments: [
|
|
637
|
+
{ name: 'M24', quality: 'legendary', level: 88 },
|
|
638
|
+
{ name: 'Compensator', quality: 'epic', level: 80 },
|
|
639
|
+
{ name: 'Scope 8x', quality: 'legendary', level: 85 },
|
|
640
|
+
{ name: 'Level 2 Helmet', quality: 'rare', level: 75 }
|
|
641
|
+
]
|
|
642
|
+
},
|
|
643
|
+
{
|
|
644
|
+
name: 'RushMaster',
|
|
645
|
+
score: 7500,
|
|
646
|
+
equipments: [
|
|
647
|
+
{ name: 'Vector', quality: 'rare', level: 72 },
|
|
648
|
+
{ name: 'Level 2 Helmet', quality: 'common', level: 65 },
|
|
649
|
+
{ name: 'Quickdraw Mag', quality: 'common', level: 60 },
|
|
650
|
+
{ name: 'Laser Sight', quality: 'rare', level: 68 }
|
|
651
|
+
]
|
|
652
|
+
},
|
|
653
|
+
{
|
|
654
|
+
name: 'GhostWarrior',
|
|
655
|
+
score: 8200,
|
|
656
|
+
equipments: [
|
|
657
|
+
{ name: 'SCAR-L', quality: 'epic', level: 78 },
|
|
658
|
+
{ name: 'Extended Quickdraw Mag', quality: 'rare', level: 70 },
|
|
659
|
+
{ name: 'Holographic Sight', quality: 'epic', level: 75 },
|
|
660
|
+
{ name: 'Suppressor', quality: 'rare', level: 72 },
|
|
661
|
+
{ name: 'Vertical Grip', quality: 'common', level: 65 }
|
|
662
|
+
]
|
|
663
|
+
},
|
|
664
|
+
{
|
|
665
|
+
name: 'DeathDealer',
|
|
666
|
+
score: 7300,
|
|
667
|
+
equipments: [
|
|
668
|
+
{ name: 'SKS', quality: 'epic', level: 76 },
|
|
669
|
+
{ name: 'Holographic Sight', quality: 'rare', level: 68 },
|
|
670
|
+
{ name: 'Extended Mag', quality: 'common', level: 65 }
|
|
671
|
+
]
|
|
672
|
+
},
|
|
673
|
+
{
|
|
674
|
+
name: 'StormRider',
|
|
675
|
+
score: 8900,
|
|
676
|
+
equipments: [
|
|
677
|
+
{ name: 'MK14', quality: 'legendary', level: 92 },
|
|
678
|
+
{ name: 'Level 3 Backpack', quality: 'legendary', level: 85 },
|
|
679
|
+
{ name: 'Scope 8x', quality: 'epic', level: 80 },
|
|
680
|
+
{ name: 'Suppressor', quality: 'legendary', level: 88 },
|
|
681
|
+
{ name: 'Tactical Stock', quality: 'rare', level: 75 }
|
|
682
|
+
]
|
|
683
|
+
},
|
|
684
|
+
{
|
|
685
|
+
name: 'CombatLegend',
|
|
686
|
+
score: 7600,
|
|
687
|
+
equipments: [
|
|
688
|
+
{ name: 'UMP45', quality: 'rare', level: 74 },
|
|
689
|
+
{ name: 'Level 2 Vest', quality: 'common', level: 67 },
|
|
690
|
+
{ name: 'Red Dot Sight', quality: 'common', level: 62 },
|
|
691
|
+
{ name: 'Extended Mag', quality: 'rare', level: 70 }
|
|
692
|
+
]
|
|
693
|
+
}
|
|
694
|
+
];
|
|
695
|
+
|
|
696
|
+
// Create a TreeMultiMap for player rankings
|
|
697
|
+
const playerRankings = new AVLTreeMultiMap<number, Equipment, Player>(players, {
|
|
698
|
+
toEntryFn: ({ score, equipments }) => [score, equipments],
|
|
699
|
+
isMapMode: false
|
|
700
|
+
});
|
|
701
|
+
|
|
702
|
+
const topPlayersEquipments = playerRankings.rangeSearch([8900, 10000], node => playerRankings.get(node));
|
|
703
|
+
expect(topPlayersEquipments).toEqual([
|
|
704
|
+
[
|
|
705
|
+
{
|
|
706
|
+
name: 'MK14',
|
|
707
|
+
quality: 'legendary',
|
|
708
|
+
level: 92
|
|
709
|
+
},
|
|
710
|
+
{ name: 'Level 3 Backpack', quality: 'legendary', level: 85 },
|
|
711
|
+
{
|
|
712
|
+
name: 'Scope 8x',
|
|
713
|
+
quality: 'epic',
|
|
714
|
+
level: 80
|
|
715
|
+
},
|
|
716
|
+
{ name: 'Suppressor', quality: 'legendary', level: 88 },
|
|
717
|
+
{
|
|
718
|
+
name: 'Tactical Stock',
|
|
719
|
+
quality: 'rare',
|
|
720
|
+
level: 75
|
|
721
|
+
}
|
|
722
|
+
],
|
|
723
|
+
[
|
|
724
|
+
{ name: 'KAR98K', quality: 'legendary', level: 90 },
|
|
725
|
+
{
|
|
726
|
+
name: 'Level 3 Vest',
|
|
727
|
+
quality: 'legendary',
|
|
728
|
+
level: 85
|
|
729
|
+
},
|
|
730
|
+
{ name: 'Holographic Sight', quality: 'epic', level: 82 },
|
|
731
|
+
{
|
|
732
|
+
name: 'Suppressor',
|
|
733
|
+
quality: 'legendary',
|
|
734
|
+
level: 88
|
|
735
|
+
},
|
|
736
|
+
{ name: 'Level 3 Backpack', quality: 'epic', level: 80 }
|
|
737
|
+
]
|
|
738
|
+
]);
|
|
739
|
+
});
|
|
740
|
+
});
|
|
@@ -24,7 +24,7 @@ describe('AVL Tree Test', () => {
|
|
|
24
24
|
expect(getMinNodeBySpecificNode?.key).toBe(12);
|
|
25
25
|
|
|
26
26
|
let subTreeSum = 0;
|
|
27
|
-
if (node15) avlTree.dfs(node => (subTreeSum += node.key), 'PRE', node15);
|
|
27
|
+
if (node15) avlTree.dfs(node => (subTreeSum += node.key), 'PRE', false, node15);
|
|
28
28
|
expect(subTreeSum).toBe(70);
|
|
29
29
|
|
|
30
30
|
let lesserSum = 0;
|
|
@@ -150,7 +150,7 @@ describe('AVL Tree Test recursively', () => {
|
|
|
150
150
|
expect(getMinNodeBySpecificNode?.key).toBe(12);
|
|
151
151
|
|
|
152
152
|
let subTreeSum = 0;
|
|
153
|
-
if (node15) avlTree.dfs(node => (subTreeSum += node.key), 'PRE', node15);
|
|
153
|
+
if (node15) avlTree.dfs(node => (subTreeSum += node.key), 'PRE', false, node15);
|
|
154
154
|
expect(subTreeSum).toBe(70);
|
|
155
155
|
|
|
156
156
|
let lesserSum = 0;
|
|
@@ -480,7 +480,7 @@ describe('AVL Tree not map mode', () => {
|
|
|
480
480
|
expect(getMinNodeBySpecificNode?.key).toBe(12);
|
|
481
481
|
|
|
482
482
|
let subTreeSum = 0;
|
|
483
|
-
if (node15) avlTree.dfs(node => (subTreeSum += node.key), 'PRE', node15);
|
|
483
|
+
if (node15) avlTree.dfs(node => (subTreeSum += node.key), 'PRE', false, node15);
|
|
484
484
|
expect(subTreeSum).toBe(70);
|
|
485
485
|
|
|
486
486
|
let lesserSum = 0;
|
|
@@ -515,7 +515,7 @@ describe('AVL Tree not map mode test recursively', () => {
|
|
|
515
515
|
expect(getMinNodeBySpecificNode?.key).toBe(12);
|
|
516
516
|
|
|
517
517
|
let subTreeSum = 0;
|
|
518
|
-
if (node15) avlTree.dfs(node => (subTreeSum += node.key), 'PRE', node15);
|
|
518
|
+
if (node15) avlTree.dfs(node => (subTreeSum += node.key), 'PRE', false, node15);
|
|
519
519
|
expect(subTreeSum).toBe(70);
|
|
520
520
|
|
|
521
521
|
let lesserSum = 0;
|
|
@@ -542,3 +542,71 @@ describe('AVLTree iterative methods not map mode', () => {
|
|
|
542
542
|
expect(cloned.get(cloned.root?.right?.key)).toBe('c');
|
|
543
543
|
});
|
|
544
544
|
});
|
|
545
|
+
|
|
546
|
+
describe('classic use', () => {
|
|
547
|
+
// Test case for finding elements in a given range
|
|
548
|
+
it('@example Find elements in a range', () => {
|
|
549
|
+
// In interval queries, AVL trees, with their strictly balanced structure and lower height, offer better query efficiency, making them ideal for frequent and high-performance interval queries. In contrast, Red-Black trees, with lower update costs, are more suitable for scenarios involving frequent insertions and deletions where the requirements for interval queries are less demanding.
|
|
550
|
+
type Datum = { timestamp: Date; temperature: number };
|
|
551
|
+
// Fixed dataset of CPU temperature readings
|
|
552
|
+
const cpuData: Datum[] = [
|
|
553
|
+
{ timestamp: new Date('2024-12-02T00:00:00'), temperature: 55.1 },
|
|
554
|
+
{ timestamp: new Date('2024-12-02T00:01:00'), temperature: 56.3 },
|
|
555
|
+
{ timestamp: new Date('2024-12-02T00:02:00'), temperature: 54.8 },
|
|
556
|
+
{ timestamp: new Date('2024-12-02T00:03:00'), temperature: 57.2 },
|
|
557
|
+
{ timestamp: new Date('2024-12-02T00:04:00'), temperature: 58.0 },
|
|
558
|
+
{ timestamp: new Date('2024-12-02T00:05:00'), temperature: 59.4 },
|
|
559
|
+
{ timestamp: new Date('2024-12-02T00:06:00'), temperature: 60.1 },
|
|
560
|
+
{ timestamp: new Date('2024-12-02T00:07:00'), temperature: 61.3 },
|
|
561
|
+
{ timestamp: new Date('2024-12-02T00:08:00'), temperature: 62.0 },
|
|
562
|
+
{ timestamp: new Date('2024-12-02T00:09:00'), temperature: 63.5 },
|
|
563
|
+
{ timestamp: new Date('2024-12-02T00:10:00'), temperature: 64.0 },
|
|
564
|
+
{ timestamp: new Date('2024-12-02T00:11:00'), temperature: 62.8 },
|
|
565
|
+
{ timestamp: new Date('2024-12-02T00:12:00'), temperature: 61.5 },
|
|
566
|
+
{ timestamp: new Date('2024-12-02T00:13:00'), temperature: 60.2 },
|
|
567
|
+
{ timestamp: new Date('2024-12-02T00:14:00'), temperature: 59.8 },
|
|
568
|
+
{ timestamp: new Date('2024-12-02T00:15:00'), temperature: 58.6 },
|
|
569
|
+
{ timestamp: new Date('2024-12-02T00:16:00'), temperature: 57.4 },
|
|
570
|
+
{ timestamp: new Date('2024-12-02T00:17:00'), temperature: 56.2 },
|
|
571
|
+
{ timestamp: new Date('2024-12-02T00:18:00'), temperature: 55.7 },
|
|
572
|
+
{ timestamp: new Date('2024-12-02T00:19:00'), temperature: 54.5 },
|
|
573
|
+
{ timestamp: new Date('2024-12-02T00:20:00'), temperature: 53.2 },
|
|
574
|
+
{ timestamp: new Date('2024-12-02T00:21:00'), temperature: 52.8 },
|
|
575
|
+
{ timestamp: new Date('2024-12-02T00:22:00'), temperature: 51.9 },
|
|
576
|
+
{ timestamp: new Date('2024-12-02T00:23:00'), temperature: 50.5 },
|
|
577
|
+
{ timestamp: new Date('2024-12-02T00:24:00'), temperature: 49.8 },
|
|
578
|
+
{ timestamp: new Date('2024-12-02T00:25:00'), temperature: 48.7 },
|
|
579
|
+
{ timestamp: new Date('2024-12-02T00:26:00'), temperature: 47.5 },
|
|
580
|
+
{ timestamp: new Date('2024-12-02T00:27:00'), temperature: 46.3 },
|
|
581
|
+
{ timestamp: new Date('2024-12-02T00:28:00'), temperature: 45.9 },
|
|
582
|
+
{ timestamp: new Date('2024-12-02T00:29:00'), temperature: 45.0 }
|
|
583
|
+
];
|
|
584
|
+
|
|
585
|
+
// Create an AVL tree to store CPU temperature data
|
|
586
|
+
const cpuTemperatureTree = new AVLTree<Date, number, Datum>(cpuData, {
|
|
587
|
+
toEntryFn: ({ timestamp, temperature }) => [timestamp, temperature]
|
|
588
|
+
});
|
|
589
|
+
|
|
590
|
+
// Query a specific time range (e.g., from 00:05 to 00:15)
|
|
591
|
+
const rangeStart = new Date('2024-12-02T00:05:00');
|
|
592
|
+
const rangeEnd = new Date('2024-12-02T00:15:00');
|
|
593
|
+
const rangeResults = cpuTemperatureTree.rangeSearch([rangeStart, rangeEnd], node => ({
|
|
594
|
+
minute: node ? node.key.getMinutes() : 0,
|
|
595
|
+
temperature: cpuTemperatureTree.get(node ? node.key : undefined)
|
|
596
|
+
}));
|
|
597
|
+
|
|
598
|
+
expect(rangeResults).toEqual([
|
|
599
|
+
{ minute: 5, temperature: 59.4 },
|
|
600
|
+
{ minute: 6, temperature: 60.1 },
|
|
601
|
+
{ minute: 7, temperature: 61.3 },
|
|
602
|
+
{ minute: 8, temperature: 62 },
|
|
603
|
+
{ minute: 9, temperature: 63.5 },
|
|
604
|
+
{ minute: 10, temperature: 64 },
|
|
605
|
+
{ minute: 11, temperature: 62.8 },
|
|
606
|
+
{ minute: 12, temperature: 61.5 },
|
|
607
|
+
{ minute: 13, temperature: 60.2 },
|
|
608
|
+
{ minute: 14, temperature: 59.8 },
|
|
609
|
+
{ minute: 15, temperature: 58.6 }
|
|
610
|
+
]);
|
|
611
|
+
});
|
|
612
|
+
});
|
|
@@ -217,20 +217,20 @@ describe('BinaryTree', () => {
|
|
|
217
217
|
expect(cloned.root?.right?.key).toBe(6);
|
|
218
218
|
expect(cloned.root?.right?.left?.key).toBe(3);
|
|
219
219
|
expect(cloned.root?.right?.right).toBe(null);
|
|
220
|
-
expect(cloned.dfs(node => node.key, 'PRE', cloned.getNode(6), 'ITERATIVE')).toEqual([6, 3, 7]);
|
|
221
|
-
expect(cloned.dfs(node => (node ? node.key : null), 'PRE', cloned.getNode(6), 'ITERATIVE', true)).toEqual([
|
|
220
|
+
expect(cloned.dfs(node => node.key, 'PRE', false, cloned.getNode(6), 'ITERATIVE')).toEqual([6, 3, 7]);
|
|
221
|
+
expect(cloned.dfs(node => (node ? node.key : null), 'PRE', false, cloned.getNode(6), 'ITERATIVE', true)).toEqual([
|
|
222
222
|
6,
|
|
223
223
|
3,
|
|
224
224
|
7,
|
|
225
225
|
null
|
|
226
226
|
]);
|
|
227
|
-
expect(cloned.dfs(node => (node ? node.key : node), 'PRE', cloned.getNode(6), 'ITERATIVE', true)).toEqual([
|
|
227
|
+
expect(cloned.dfs(node => (node ? node.key : node), 'PRE', false, cloned.getNode(6), 'ITERATIVE', true)).toEqual([
|
|
228
228
|
6,
|
|
229
229
|
3,
|
|
230
230
|
7,
|
|
231
231
|
null
|
|
232
232
|
]);
|
|
233
|
-
expect(cloned.dfs(node => (node ? node.key : null), 'PRE', cloned.getNode(6), 'RECURSIVE', true)).toEqual([
|
|
233
|
+
expect(cloned.dfs(node => (node ? node.key : null), 'PRE', false, cloned.getNode(6), 'RECURSIVE', true)).toEqual([
|
|
234
234
|
6,
|
|
235
235
|
3,
|
|
236
236
|
7,
|
|
@@ -532,11 +532,11 @@ describe('BinaryTree', () => {
|
|
|
532
532
|
expect(binTree.dfs()).toEqual([]);
|
|
533
533
|
expect([...binTree.values()]).toEqual([]);
|
|
534
534
|
binTree.addMany([4, 2, 6, null, 1, 3, null, 5, null, 7]);
|
|
535
|
-
expect(binTree.dfs(node => node.key, 'PRE', undefined, 'ITERATIVE')).toEqual([4, 2, 1, 5, 6, 3, 7]);
|
|
536
|
-
expect(binTree.dfs(node => (node !== null ? node.key : null), 'PRE', undefined, 'ITERATIVE', false)).toEqual(
|
|
537
|
-
4, 2, 1, 5, 6, 3, 7
|
|
538
|
-
|
|
539
|
-
expect(binTree.dfs(node => (node !== null ? node.key : null), 'PRE', undefined, 'ITERATIVE', true)).toEqual([
|
|
535
|
+
expect(binTree.dfs(node => node.key, 'PRE', false, undefined, 'ITERATIVE')).toEqual([4, 2, 1, 5, 6, 3, 7]);
|
|
536
|
+
expect(binTree.dfs(node => (node !== null ? node.key : null), 'PRE', false, undefined, 'ITERATIVE', false)).toEqual(
|
|
537
|
+
[4, 2, 1, 5, 6, 3, 7]
|
|
538
|
+
);
|
|
539
|
+
expect(binTree.dfs(node => (node !== null ? node.key : null), 'PRE', false, undefined, 'ITERATIVE', true)).toEqual([
|
|
540
540
|
4,
|
|
541
541
|
2,
|
|
542
542
|
null,
|
|
@@ -549,11 +549,11 @@ describe('BinaryTree', () => {
|
|
|
549
549
|
null
|
|
550
550
|
]);
|
|
551
551
|
|
|
552
|
-
expect(binTree.dfs(node => node.key, 'PRE', undefined, 'RECURSIVE')).toEqual([4, 2, 1, 5, 6, 3, 7]);
|
|
553
|
-
expect(binTree.dfs(node => (node !== null ? node.key : null), 'PRE', undefined, 'RECURSIVE', false)).toEqual(
|
|
554
|
-
4, 2, 1, 5, 6, 3, 7
|
|
555
|
-
|
|
556
|
-
expect(binTree.dfs(node => (node !== null ? node.key : null), 'PRE', undefined, 'RECURSIVE', true)).toEqual([
|
|
552
|
+
expect(binTree.dfs(node => node.key, 'PRE', false, undefined, 'RECURSIVE')).toEqual([4, 2, 1, 5, 6, 3, 7]);
|
|
553
|
+
expect(binTree.dfs(node => (node !== null ? node.key : null), 'PRE', false, undefined, 'RECURSIVE', false)).toEqual(
|
|
554
|
+
[4, 2, 1, 5, 6, 3, 7]
|
|
555
|
+
);
|
|
556
|
+
expect(binTree.dfs(node => (node !== null ? node.key : null), 'PRE', false, undefined, 'RECURSIVE', true)).toEqual([
|
|
557
557
|
4,
|
|
558
558
|
2,
|
|
559
559
|
null,
|
|
@@ -566,11 +566,11 @@ describe('BinaryTree', () => {
|
|
|
566
566
|
null
|
|
567
567
|
]);
|
|
568
568
|
|
|
569
|
-
expect(binTree.dfs(node => node.key, 'IN', undefined, 'ITERATIVE')).toEqual([2, 5, 1, 4, 7, 3, 6]);
|
|
570
|
-
expect(binTree.dfs(node => (node !== null ? node.key : null), 'IN', undefined, 'ITERATIVE', false)).toEqual([
|
|
569
|
+
expect(binTree.dfs(node => node.key, 'IN', false, undefined, 'ITERATIVE')).toEqual([2, 5, 1, 4, 7, 3, 6]);
|
|
570
|
+
expect(binTree.dfs(node => (node !== null ? node.key : null), 'IN', false, undefined, 'ITERATIVE', false)).toEqual([
|
|
571
571
|
2, 5, 1, 4, 7, 3, 6
|
|
572
572
|
]);
|
|
573
|
-
expect(binTree.dfs(node => (node !== null ? node.key : null), 'IN', undefined, 'ITERATIVE', true)).toEqual([
|
|
573
|
+
expect(binTree.dfs(node => (node !== null ? node.key : null), 'IN', false, undefined, 'ITERATIVE', true)).toEqual([
|
|
574
574
|
null,
|
|
575
575
|
2,
|
|
576
576
|
5,
|
|
@@ -583,11 +583,11 @@ describe('BinaryTree', () => {
|
|
|
583
583
|
null
|
|
584
584
|
]);
|
|
585
585
|
|
|
586
|
-
expect(binTree.dfs(node => node.key, 'IN', undefined, 'RECURSIVE')).toEqual([2, 5, 1, 4, 7, 3, 6]);
|
|
587
|
-
expect(binTree.dfs(node => (node !== null ? node.key : null), 'IN', undefined, 'RECURSIVE', false)).toEqual([
|
|
586
|
+
expect(binTree.dfs(node => node.key, 'IN', false, undefined, 'RECURSIVE')).toEqual([2, 5, 1, 4, 7, 3, 6]);
|
|
587
|
+
expect(binTree.dfs(node => (node !== null ? node.key : null), 'IN', false, undefined, 'RECURSIVE', false)).toEqual([
|
|
588
588
|
2, 5, 1, 4, 7, 3, 6
|
|
589
589
|
]);
|
|
590
|
-
expect(binTree.dfs(node => (node !== null ? node.key : null), 'IN', undefined, 'RECURSIVE', true)).toEqual([
|
|
590
|
+
expect(binTree.dfs(node => (node !== null ? node.key : null), 'IN', false, undefined, 'RECURSIVE', true)).toEqual([
|
|
591
591
|
null,
|
|
592
592
|
2,
|
|
593
593
|
5,
|
|
@@ -600,89 +600,71 @@ describe('BinaryTree', () => {
|
|
|
600
600
|
null
|
|
601
601
|
]);
|
|
602
602
|
|
|
603
|
-
expect(binTree.dfs(node => node.key, 'POST', undefined, 'ITERATIVE')).toEqual([5, 1, 2, 7, 3, 6, 4]);
|
|
604
|
-
expect(
|
|
605
|
-
|
|
606
|
-
]);
|
|
607
|
-
expect(binTree.dfs(node => (node !== null ? node.key : null), 'POST', undefined, 'ITERATIVE', true)).toEqual(
|
|
608
|
-
null,
|
|
609
|
-
|
|
610
|
-
null,
|
|
611
|
-
1,
|
|
612
|
-
2,
|
|
613
|
-
7,
|
|
614
|
-
3,
|
|
615
|
-
null,
|
|
616
|
-
6,
|
|
617
|
-
4
|
|
618
|
-
]);
|
|
603
|
+
expect(binTree.dfs(node => node.key, 'POST', false, undefined, 'ITERATIVE')).toEqual([5, 1, 2, 7, 3, 6, 4]);
|
|
604
|
+
expect(
|
|
605
|
+
binTree.dfs(node => (node !== null ? node.key : null), 'POST', false, undefined, 'ITERATIVE', false)
|
|
606
|
+
).toEqual([5, 1, 2, 7, 3, 6, 4]);
|
|
607
|
+
expect(binTree.dfs(node => (node !== null ? node.key : null), 'POST', false, undefined, 'ITERATIVE', true)).toEqual(
|
|
608
|
+
[null, 5, null, 1, 2, 7, 3, null, 6, 4]
|
|
609
|
+
);
|
|
619
610
|
|
|
620
|
-
expect(binTree.dfs(node => node.key, 'POST', undefined, 'RECURSIVE')).toEqual([5, 1, 2, 7, 3, 6, 4]);
|
|
621
|
-
expect(
|
|
622
|
-
|
|
623
|
-
]);
|
|
624
|
-
expect(binTree.dfs(node => (node !== null ? node.key : null), 'POST', undefined, 'RECURSIVE', true)).toEqual(
|
|
625
|
-
null,
|
|
626
|
-
|
|
627
|
-
null,
|
|
628
|
-
1,
|
|
629
|
-
2,
|
|
630
|
-
7,
|
|
631
|
-
3,
|
|
632
|
-
null,
|
|
633
|
-
6,
|
|
634
|
-
4
|
|
635
|
-
]);
|
|
611
|
+
expect(binTree.dfs(node => node.key, 'POST', false, undefined, 'RECURSIVE')).toEqual([5, 1, 2, 7, 3, 6, 4]);
|
|
612
|
+
expect(
|
|
613
|
+
binTree.dfs(node => (node !== null ? node.key : null), 'POST', false, undefined, 'RECURSIVE', false)
|
|
614
|
+
).toEqual([5, 1, 2, 7, 3, 6, 4]);
|
|
615
|
+
expect(binTree.dfs(node => (node !== null ? node.key : null), 'POST', false, undefined, 'RECURSIVE', true)).toEqual(
|
|
616
|
+
[null, 5, null, 1, 2, 7, 3, null, 6, 4]
|
|
617
|
+
);
|
|
636
618
|
});
|
|
637
619
|
|
|
638
620
|
it('should sub binTree traverse', () => {
|
|
639
621
|
binTree.addMany([4, 2, 6, null, 1, 3, null, 5, null, 7]);
|
|
640
|
-
expect(binTree.dfs(node => node.key, 'PRE', binTree.getNode(6), 'ITERATIVE')).toEqual([6, 3, 7]);
|
|
622
|
+
expect(binTree.dfs(node => node.key, 'PRE', false, binTree.getNode(6), 'ITERATIVE')).toEqual([6, 3, 7]);
|
|
641
623
|
expect(
|
|
642
|
-
binTree.dfs(node => (node !== null ? node.key : null), 'PRE', binTree.getNode(6), 'ITERATIVE', false)
|
|
624
|
+
binTree.dfs(node => (node !== null ? node.key : null), 'PRE', false, binTree.getNode(6), 'ITERATIVE', false)
|
|
643
625
|
).toEqual([6, 3, 7]);
|
|
644
626
|
expect(
|
|
645
|
-
binTree.dfs(node => (node !== null ? node.key : null), 'PRE', binTree.getNode(6), 'ITERATIVE', true)
|
|
627
|
+
binTree.dfs(node => (node !== null ? node.key : null), 'PRE', false, binTree.getNode(6), 'ITERATIVE', true)
|
|
646
628
|
).toEqual([6, 3, 7, null]);
|
|
647
629
|
|
|
648
|
-
expect(binTree.dfs(node => node.key, 'PRE', binTree.getNode(6), 'RECURSIVE')).toEqual([6, 3, 7]);
|
|
630
|
+
expect(binTree.dfs(node => node.key, 'PRE', false, binTree.getNode(6), 'RECURSIVE')).toEqual([6, 3, 7]);
|
|
649
631
|
expect(
|
|
650
|
-
binTree.dfs(node => (node !== null ? node.key : null), 'PRE', binTree.getNode(6), 'RECURSIVE', false)
|
|
632
|
+
binTree.dfs(node => (node !== null ? node.key : null), 'PRE', false, binTree.getNode(6), 'RECURSIVE', false)
|
|
651
633
|
).toEqual([6, 3, 7]);
|
|
652
634
|
expect(
|
|
653
|
-
binTree.dfs(node => (node !== null ? node.key : null), 'PRE', binTree.getNode(6), 'RECURSIVE', true)
|
|
635
|
+
binTree.dfs(node => (node !== null ? node.key : null), 'PRE', false, binTree.getNode(6), 'RECURSIVE', true)
|
|
654
636
|
).toEqual([6, 3, 7, null]);
|
|
655
637
|
|
|
656
|
-
expect(binTree.dfs(node => node.key, 'IN', binTree.getNode(6), 'ITERATIVE')).toEqual([7, 3, 6]);
|
|
638
|
+
expect(binTree.dfs(node => node.key, 'IN', false, binTree.getNode(6), 'ITERATIVE')).toEqual([7, 3, 6]);
|
|
657
639
|
expect(
|
|
658
|
-
binTree.dfs(node => (node !== null ? node.key : null), 'IN', binTree.getNode(6), 'ITERATIVE', false)
|
|
640
|
+
binTree.dfs(node => (node !== null ? node.key : null), 'IN', false, binTree.getNode(6), 'ITERATIVE', false)
|
|
659
641
|
).toEqual([7, 3, 6]);
|
|
660
|
-
expect(
|
|
661
|
-
|
|
662
|
-
);
|
|
642
|
+
expect(
|
|
643
|
+
binTree.dfs(node => (node !== null ? node.key : null), 'IN', false, binTree.getNode(6), 'ITERATIVE', true)
|
|
644
|
+
).toEqual([7, 3, 6, null]);
|
|
663
645
|
|
|
664
|
-
expect(binTree.dfs(node => node.key, 'IN', binTree.getNode(6), 'RECURSIVE')).toEqual([7, 3, 6]);
|
|
646
|
+
expect(binTree.dfs(node => node.key, 'IN', false, binTree.getNode(6), 'RECURSIVE')).toEqual([7, 3, 6]);
|
|
665
647
|
expect(
|
|
666
|
-
binTree.dfs(node => (node !== null ? node.key : null), 'IN', binTree.getNode(6), 'RECURSIVE', false)
|
|
648
|
+
binTree.dfs(node => (node !== null ? node.key : null), 'IN', false, binTree.getNode(6), 'RECURSIVE', false)
|
|
667
649
|
).toEqual([7, 3, 6]);
|
|
668
|
-
expect(
|
|
669
|
-
|
|
670
|
-
);
|
|
650
|
+
expect(
|
|
651
|
+
binTree.dfs(node => (node !== null ? node.key : null), 'IN', false, binTree.getNode(6), 'RECURSIVE', true)
|
|
652
|
+
).toEqual([7, 3, 6, null]);
|
|
671
653
|
|
|
672
|
-
expect(binTree.dfs(node => node.key, 'POST', binTree.getNode(6), 'ITERATIVE')).toEqual([7, 3, 6]);
|
|
654
|
+
expect(binTree.dfs(node => node.key, 'POST', false, binTree.getNode(6), 'ITERATIVE')).toEqual([7, 3, 6]);
|
|
673
655
|
expect(
|
|
674
|
-
binTree.dfs(node => (node !== null ? node.key : null), 'POST', binTree.getNode(6), 'ITERATIVE', false)
|
|
656
|
+
binTree.dfs(node => (node !== null ? node.key : null), 'POST', false, binTree.getNode(6), 'ITERATIVE', false)
|
|
675
657
|
).toEqual([7, 3, 6]);
|
|
676
658
|
expect(
|
|
677
|
-
binTree.dfs(node => (node !== null ? node.key : null), 'POST', binTree.getNode(6), 'ITERATIVE', true)
|
|
659
|
+
binTree.dfs(node => (node !== null ? node.key : null), 'POST', false, binTree.getNode(6), 'ITERATIVE', true)
|
|
678
660
|
).toEqual([7, 3, null, 6]);
|
|
679
661
|
|
|
680
|
-
expect(binTree.dfs(node => node.key, 'POST', binTree.getNode(6), 'RECURSIVE')).toEqual([7, 3, 6]);
|
|
662
|
+
expect(binTree.dfs(node => node.key, 'POST', false, binTree.getNode(6), 'RECURSIVE')).toEqual([7, 3, 6]);
|
|
681
663
|
expect(
|
|
682
|
-
binTree.dfs(node => (node !== null ? node.key : null), 'POST', binTree.getNode(6), 'RECURSIVE', false)
|
|
664
|
+
binTree.dfs(node => (node !== null ? node.key : null), 'POST', false, binTree.getNode(6), 'RECURSIVE', false)
|
|
683
665
|
).toEqual([7, 3, 6]);
|
|
684
666
|
expect(
|
|
685
|
-
binTree.dfs(node => (node !== null ? node.key : null), 'POST', binTree.getNode(6), 'RECURSIVE', true)
|
|
667
|
+
binTree.dfs(node => (node !== null ? node.key : null), 'POST', false, binTree.getNode(6), 'RECURSIVE', true)
|
|
686
668
|
).toEqual([7, 3, null, 6]);
|
|
687
669
|
});
|
|
688
670
|
|
|
@@ -814,7 +796,7 @@ describe('BinaryTree Morris Traversal', () => {
|
|
|
814
796
|
|
|
815
797
|
expect(result).toEqual(expected);
|
|
816
798
|
expect(binTree.dfs(node => node.key, 'IN')).toEqual(expected);
|
|
817
|
-
expect(binTree.dfs(node => node.key, 'IN', binTree.root, 'RECURSIVE')).toEqual(expected);
|
|
799
|
+
expect(binTree.dfs(node => node.key, 'IN', false, binTree.root, 'RECURSIVE')).toEqual(expected);
|
|
818
800
|
});
|
|
819
801
|
|
|
820
802
|
it('should perform pre-order Morris traversal correctly as dfs traversal', () => {
|
|
@@ -875,7 +857,7 @@ describe('BinaryTree toEntryFn', () => {
|
|
|
875
857
|
|
|
876
858
|
expect(binTree.morris(node => node.key, 'IN')).toEqual(expected);
|
|
877
859
|
expect(binTree.dfs(node => node.key, 'IN')).toEqual(expected);
|
|
878
|
-
expect(binTree.dfs(node => node.key, 'IN', binTree.root, 'RECURSIVE')).toEqual(expected);
|
|
860
|
+
expect(binTree.dfs(node => node.key, 'IN', false, binTree.root, 'RECURSIVE')).toEqual(expected);
|
|
879
861
|
});
|
|
880
862
|
|
|
881
863
|
it('should toEntryFn with initial', () => {
|
|
@@ -890,7 +872,7 @@ describe('BinaryTree toEntryFn', () => {
|
|
|
890
872
|
|
|
891
873
|
expect(binTree.morris(node => node.key, 'IN')).toEqual(expected);
|
|
892
874
|
expect(binTree.dfs(node => node.key, 'IN')).toEqual(expected);
|
|
893
|
-
expect(binTree.dfs(node => node.key, 'IN', binTree.root, 'RECURSIVE')).toEqual(expected);
|
|
875
|
+
expect(binTree.dfs(node => node.key, 'IN', false, binTree.root, 'RECURSIVE')).toEqual(expected);
|
|
894
876
|
});
|
|
895
877
|
|
|
896
878
|
it('should no toEntryFn', () => {
|
|
@@ -905,7 +887,7 @@ describe('BinaryTree toEntryFn', () => {
|
|
|
905
887
|
|
|
906
888
|
expect(binTree.morris(node => node.key, 'IN')).toEqual(data.sort((a, b) => a.obj.id - b.obj.id));
|
|
907
889
|
expect(binTree.dfs(node => node.key, 'IN')).toEqual(data);
|
|
908
|
-
expect(binTree.dfs(node => node.key, 'IN', binTree.root, 'RECURSIVE')).toEqual(data);
|
|
890
|
+
expect(binTree.dfs(node => node.key, 'IN', false, binTree.root, 'RECURSIVE')).toEqual(data);
|
|
909
891
|
});
|
|
910
892
|
});
|
|
911
893
|
|
|
@@ -953,19 +935,21 @@ describe('BinaryTree traversals', () => {
|
|
|
953
935
|
);
|
|
954
936
|
|
|
955
937
|
expect(binTree.dfs(node => node.key, 'PRE')).toEqual([35, 20, 15, 16, 29, 28, 30, 40, 50, 45, 55]);
|
|
956
|
-
expect(binTree.dfs(node => node.key, 'PRE', binTree.root, 'RECURSIVE')).toEqual([
|
|
938
|
+
expect(binTree.dfs(node => node.key, 'PRE', false, binTree.root, 'RECURSIVE')).toEqual([
|
|
957
939
|
35, 20, 15, 16, 29, 28, 30, 40, 50, 45, 55
|
|
958
940
|
]);
|
|
959
941
|
expect(
|
|
960
|
-
binTree
|
|
942
|
+
binTree
|
|
943
|
+
.dfs(node => node, 'PRE', false, binTree.root, 'ITERATIVE', true)
|
|
944
|
+
.map(node => (node === null ? null : node.key))
|
|
961
945
|
).toEqual([35, 20, 15, null, 16, 29, 28, 30, 40, null, 50, 45, 55]);
|
|
962
946
|
expect(
|
|
963
|
-
binTree.dfs(node => node, 'PRE', binTree.root, 'RECURSIVE', true).map(node => (node ? node.key : null))
|
|
947
|
+
binTree.dfs(node => node, 'PRE', false, binTree.root, 'RECURSIVE', true).map(node => (node ? node.key : null))
|
|
964
948
|
).toEqual([35, 20, 15, null, 16, 29, 28, 30, 40, null, 50, 45, 55]);
|
|
965
949
|
|
|
966
950
|
expect(binTree.dfs(node => node.key, 'IN')).toEqual([15, 16, 20, 28, 29, 30, 35, 40, 45, 50, 55]);
|
|
967
951
|
expect(binTree.dfs(node => node.key, 'POST')).toEqual([16, 15, 28, 30, 29, 20, 45, 55, 50, 40, 35]);
|
|
968
|
-
expect(binTree.dfs(node => node.key, 'POST', binTree.root, 'RECURSIVE')).toEqual([
|
|
952
|
+
expect(binTree.dfs(node => node.key, 'POST', false, binTree.root, 'RECURSIVE')).toEqual([
|
|
969
953
|
16, 15, 28, 30, 29, 20, 45, 55, 50, 40, 35
|
|
970
954
|
]);
|
|
971
955
|
expect(binTree.bfs(node => node.key, binTree.root, 'RECURSIVE')).toEqual([
|
|
@@ -1434,3 +1418,69 @@ describe('BinaryTree not map mode iterative methods test', () => {
|
|
|
1434
1418
|
expect(cloned.get(cloned.root?.right)).toBe('c');
|
|
1435
1419
|
});
|
|
1436
1420
|
});
|
|
1421
|
+
|
|
1422
|
+
describe('classic use', () => {
|
|
1423
|
+
it('@example determine loan approval using a decision tree', () => {
|
|
1424
|
+
// Decision tree structure
|
|
1425
|
+
const loanDecisionTree = new BinaryTree<string>(
|
|
1426
|
+
['stableIncome', 'goodCredit', 'Rejected', 'Approved', 'Rejected'],
|
|
1427
|
+
{ isDuplicate: true }
|
|
1428
|
+
);
|
|
1429
|
+
|
|
1430
|
+
function determineLoanApproval(
|
|
1431
|
+
node?: BinaryTreeNode<string> | null,
|
|
1432
|
+
conditions?: { [key: string]: boolean }
|
|
1433
|
+
): string {
|
|
1434
|
+
if (!node) throw new Error('Invalid node');
|
|
1435
|
+
|
|
1436
|
+
// If it's a leaf node, return the decision result
|
|
1437
|
+
if (!node.left && !node.right) return node.key;
|
|
1438
|
+
|
|
1439
|
+
// Check if a valid condition exists for the current node's key
|
|
1440
|
+
return conditions?.[node.key]
|
|
1441
|
+
? determineLoanApproval(node.left, conditions)
|
|
1442
|
+
: determineLoanApproval(node.right, conditions);
|
|
1443
|
+
}
|
|
1444
|
+
|
|
1445
|
+
// Test case 1: Stable income and good credit score
|
|
1446
|
+
expect(determineLoanApproval(loanDecisionTree.root, { stableIncome: true, goodCredit: true })).toBe('Approved');
|
|
1447
|
+
|
|
1448
|
+
// Test case 2: Stable income but poor credit score
|
|
1449
|
+
expect(determineLoanApproval(loanDecisionTree.root, { stableIncome: true, goodCredit: false })).toBe('Rejected');
|
|
1450
|
+
|
|
1451
|
+
// Test case 3: No stable income
|
|
1452
|
+
expect(determineLoanApproval(loanDecisionTree.root, { stableIncome: false, goodCredit: true })).toBe('Rejected');
|
|
1453
|
+
|
|
1454
|
+
// Test case 4: No stable income and poor credit score
|
|
1455
|
+
expect(determineLoanApproval(loanDecisionTree.root, { stableIncome: false, goodCredit: false })).toBe('Rejected');
|
|
1456
|
+
});
|
|
1457
|
+
|
|
1458
|
+
it('@example evaluate the arithmetic expression represented by the binary tree', () => {
|
|
1459
|
+
const expressionTree = new BinaryTree<number | string>(['+', 3, '*', null, null, 5, '-', null, null, 2, 8]);
|
|
1460
|
+
|
|
1461
|
+
function evaluate(node?: BinaryTreeNode<number | string> | null): number {
|
|
1462
|
+
if (!node) return 0;
|
|
1463
|
+
|
|
1464
|
+
if (typeof node.key === 'number') return node.key;
|
|
1465
|
+
|
|
1466
|
+
const leftValue = evaluate(node.left); // Evaluate the left subtree
|
|
1467
|
+
const rightValue = evaluate(node.right); // Evaluate the right subtree
|
|
1468
|
+
|
|
1469
|
+
// Perform the operation based on the current node's operator
|
|
1470
|
+
switch (node.key) {
|
|
1471
|
+
case '+':
|
|
1472
|
+
return leftValue + rightValue;
|
|
1473
|
+
case '-':
|
|
1474
|
+
return leftValue - rightValue;
|
|
1475
|
+
case '*':
|
|
1476
|
+
return leftValue * rightValue;
|
|
1477
|
+
case '/':
|
|
1478
|
+
return rightValue !== 0 ? leftValue / rightValue : 0; // Handle division by zero
|
|
1479
|
+
default:
|
|
1480
|
+
throw new Error(`Unsupported operator: ${node.key}`);
|
|
1481
|
+
}
|
|
1482
|
+
}
|
|
1483
|
+
|
|
1484
|
+
expect(evaluate(expressionTree.root)).toBe(-27);
|
|
1485
|
+
});
|
|
1486
|
+
});
|