data-structure-typed 1.54.1 → 1.54.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/CHANGELOG.md +1 -1
- package/LICENSE +2 -2
- package/README.md +14 -1
- package/README_zh-CN.md +1 -1
- package/benchmark/report.html +4 -1
- package/benchmark/report.json +76 -17
- 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 +12 -12
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js +2 -2
- 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 +25 -21
- package/dist/cjs/data-structures/binary-tree/avl-tree.js +12 -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 +111 -225
- package/dist/cjs/data-structures/binary-tree/binary-tree.js +177 -144
- package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/bst.d.ts +59 -53
- package/dist/cjs/data-structures/binary-tree/bst.js +75 -119
- package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/red-black-tree.d.ts +18 -18
- package/dist/cjs/data-structures/binary-tree/red-black-tree.js +6 -6
- 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 +12 -12
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.js +2 -2
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.js.map +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/index.d.ts +1 -1
- package/dist/cjs/types/data-structures/binary-tree/index.js +1 -1
- package/dist/cjs/types/data-structures/binary-tree/index.js.map +1 -1
- package/dist/cjs/types/data-structures/binary-tree/{rb-tree.js → red-black-tree.js} +1 -1
- package/dist/cjs/types/data-structures/binary-tree/red-black-tree.js.map +1 -0
- package/dist/cjs/types/data-structures/binary-tree/tree-counter.d.ts +1 -1
- package/dist/cjs/types/data-structures/binary-tree/tree-multi-map.d.ts +1 -1
- package/dist/cjs/utils/utils.d.ts +2 -2
- 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 +12 -12
- package/dist/esm/data-structures/binary-tree/avl-tree-multi-map.js +3 -3
- 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 +25 -21
- package/dist/esm/data-structures/binary-tree/avl-tree.js +13 -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 +111 -225
- package/dist/esm/data-structures/binary-tree/binary-tree.js +181 -148
- package/dist/esm/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/esm/data-structures/binary-tree/bst.d.ts +59 -53
- package/dist/esm/data-structures/binary-tree/bst.js +76 -120
- package/dist/esm/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/esm/data-structures/binary-tree/red-black-tree.d.ts +18 -18
- package/dist/esm/data-structures/binary-tree/red-black-tree.js +7 -7
- 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 +12 -12
- package/dist/esm/data-structures/binary-tree/tree-multi-map.js +3 -3
- package/dist/esm/data-structures/binary-tree/tree-multi-map.js.map +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/index.d.ts +1 -1
- package/dist/esm/types/data-structures/binary-tree/index.js +1 -1
- package/dist/esm/types/data-structures/binary-tree/index.js.map +1 -1
- package/dist/esm/types/data-structures/binary-tree/red-black-tree.js +2 -0
- package/dist/esm/types/data-structures/binary-tree/red-black-tree.js.map +1 -0
- package/dist/esm/types/data-structures/binary-tree/tree-counter.d.ts +1 -1
- package/dist/esm/types/data-structures/binary-tree/tree-multi-map.d.ts +1 -1
- package/dist/esm/utils/utils.d.ts +2 -2
- package/dist/umd/data-structure-typed.js +296 -279
- package/dist/umd/data-structure-typed.min.js +5 -12
- package/dist/umd/data-structure-typed.min.js.map +1 -1
- package/package.json +9 -14
- package/src/data-structures/binary-tree/avl-tree-counter.ts +30 -23
- package/src/data-structures/binary-tree/avl-tree-multi-map.ts +25 -15
- package/src/data-structures/binary-tree/avl-tree.ts +35 -29
- package/src/data-structures/binary-tree/binary-tree.ts +469 -252
- package/src/data-structures/binary-tree/bst.ts +141 -143
- 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 +25 -17
- 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/index.ts +1 -1
- package/src/types/data-structures/binary-tree/tree-counter.ts +1 -1
- package/src/types/data-structures/binary-tree/tree-multi-map.ts +1 -1
- package/src/utils/utils.ts +2 -2
- package/test/integration/compile.mjs +135 -0
- 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.mjs +505 -0
- 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 +5 -6
- package/test/unit/data-structures/binary-tree/avl-tree.test.ts +72 -5
- 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 +4 -12
- 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 +6 -6
- package/test/utils/json2html.ts +0 -154
- package/dist/cjs/types/data-structures/binary-tree/rb-tree.js.map +0 -1
- package/dist/esm/types/data-structures/binary-tree/rb-tree.js +0 -2
- package/dist/esm/types/data-structures/binary-tree/rb-tree.js.map +0 -1
- /package/dist/cjs/types/data-structures/binary-tree/{rb-tree.d.ts → red-black-tree.d.ts} +0 -0
- /package/dist/esm/types/data-structures/binary-tree/{rb-tree.d.ts → red-black-tree.d.ts} +0 -0
- /package/src/types/data-structures/binary-tree/{rb-tree.ts → red-black-tree.ts} +0 -0
- /package/test/performance/data-structures/binary-tree/{rb-tree.test.ts → red-black-tree.test.ts} +0 -0
|
@@ -91,7 +91,7 @@ describe('AVLTreeCounter operations test1', () => {
|
|
|
91
91
|
expect(minNodeBySpecificNode?.key).toBe(15);
|
|
92
92
|
|
|
93
93
|
let subTreeSum = 0;
|
|
94
|
-
if (node15) avlCounter.dfs(node => (subTreeSum += node.key), 'PRE', 15);
|
|
94
|
+
if (node15) avlCounter.dfs(node => (subTreeSum += node.key), 'PRE', false, 15);
|
|
95
95
|
expect(subTreeSum).toBe(31);
|
|
96
96
|
let lesserSum = 0;
|
|
97
97
|
avlCounter.lesserOrGreaterTraverse((node: AVLTreeCounterNode<number>) => (lesserSum += node.key), -1, 10);
|
|
@@ -99,7 +99,7 @@ describe('AVLTreeCounter operations test1', () => {
|
|
|
99
99
|
|
|
100
100
|
expect(node15 instanceof AVLTreeCounterNode);
|
|
101
101
|
if (node15 instanceof AVLTreeCounterNode) {
|
|
102
|
-
const subTreeAdd = avlCounter.dfs(node => (node.count += 1), 'PRE', 15);
|
|
102
|
+
const subTreeAdd = avlCounter.dfs(node => (node.count += 1), 'PRE', false, 15);
|
|
103
103
|
expect(subTreeAdd);
|
|
104
104
|
}
|
|
105
105
|
const node11 = avlCounter.getNode(11);
|
|
@@ -347,7 +347,7 @@ describe('AVLTreeCounter operations test recursively1', () => {
|
|
|
347
347
|
expect(minNodeBySpecificNode?.key).toBe(15);
|
|
348
348
|
|
|
349
349
|
let subTreeSum = 0;
|
|
350
|
-
if (node15) avlCounter.dfs(node => (subTreeSum += node.key), 'PRE', 15);
|
|
350
|
+
if (node15) avlCounter.dfs(node => (subTreeSum += node.key), 'PRE', false, 15);
|
|
351
351
|
expect(subTreeSum).toBe(31);
|
|
352
352
|
let lesserSum = 0;
|
|
353
353
|
avlCounter.lesserOrGreaterTraverse((node: AVLTreeCounterNode<number>) => (lesserSum += node.key), -1, 10);
|
|
@@ -355,7 +355,7 @@ describe('AVLTreeCounter operations test recursively1', () => {
|
|
|
355
355
|
|
|
356
356
|
expect(node15 instanceof AVLTreeCounterNode);
|
|
357
357
|
if (node15 instanceof AVLTreeCounterNode) {
|
|
358
|
-
const subTreeAdd = avlCounter.dfs(node => (node.count += 1), 'PRE', 15);
|
|
358
|
+
const subTreeAdd = avlCounter.dfs(node => (node.count += 1), 'PRE', false, 15);
|
|
359
359
|
expect(subTreeAdd);
|
|
360
360
|
}
|
|
361
361
|
const node11 = avlCounter.getNode(11);
|
|
@@ -709,7 +709,7 @@ describe('AVLTreeCounter toEntryFn', () => {
|
|
|
709
709
|
|
|
710
710
|
expect(avlCounter.morris(node => node.key, 'IN')).toEqual(expected);
|
|
711
711
|
expect(avlCounter.dfs(node => node.key, 'IN')).toEqual(expected);
|
|
712
|
-
expect(avlCounter.dfs(node => node.key, 'IN', avlCounter.root, 'RECURSIVE')).toEqual(expected);
|
|
712
|
+
expect(avlCounter.dfs(node => node.key, 'IN', false, avlCounter.root, 'RECURSIVE')).toEqual(expected);
|
|
713
713
|
});
|
|
714
714
|
|
|
715
715
|
it('should toEntryFn 2', () => {
|
|
@@ -724,7 +724,7 @@ describe('AVLTreeCounter toEntryFn', () => {
|
|
|
724
724
|
|
|
725
725
|
expect(avlCounter.morris(node => node.key, 'IN')).toEqual(expected);
|
|
726
726
|
expect(avlCounter.dfs(node => node.key, 'IN')).toEqual(expected);
|
|
727
|
-
expect(avlCounter.dfs(node => node.key, 'IN', avlCounter.root, 'RECURSIVE')).toEqual(expected);
|
|
727
|
+
expect(avlCounter.dfs(node => node.key, 'IN', false, avlCounter.root, 'RECURSIVE')).toEqual(expected);
|
|
728
728
|
});
|
|
729
729
|
|
|
730
730
|
it('should toEntryFn throw error', () => {
|
|
@@ -760,7 +760,7 @@ describe('AVLTreeCounter toEntryFn', () => {
|
|
|
760
760
|
|
|
761
761
|
expect(avlCounter.morris(node => node.key, 'IN')).toEqual(expected);
|
|
762
762
|
expect(avlCounter.dfs(node => node.key, 'IN')).toEqual(expected);
|
|
763
|
-
expect(avlCounter.dfs(node => node.key, 'IN', avlCounter.root, 'RECURSIVE')).toEqual(expected);
|
|
763
|
+
expect(avlCounter.dfs(node => node.key, 'IN', false, avlCounter.root, 'RECURSIVE')).toEqual(expected);
|
|
764
764
|
});
|
|
765
765
|
});
|
|
766
766
|
|
|
@@ -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;
|
|
@@ -435,7 +435,7 @@ describe('AVLTreeMultiMap iterative methods test', () => {
|
|
|
435
435
|
});
|
|
436
436
|
|
|
437
437
|
it('map should return a new avlTmm with modified elements', () => {
|
|
438
|
-
const avlTmmMapped = avlTmm.map((key, value) => [(key * 2).toString(), value ? value :[]]);
|
|
438
|
+
const avlTmmMapped = avlTmm.map((key, value) => [(key * 2).toString(), value ? value : []]);
|
|
439
439
|
expect(avlTmmMapped.size).toBe(3);
|
|
440
440
|
expect([...avlTmmMapped]).toEqual([
|
|
441
441
|
['2', ['a']],
|
|
@@ -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;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AVLTree, AVLTreeNode, BinaryTreeNode, BSTNode } from '../../../../src';
|
|
1
|
+
import { AVLTree, AVLTreeNode, BinaryTreeNode, BSTNode, Range } from '../../../../src';
|
|
2
2
|
|
|
3
3
|
describe('AVL Tree Test', () => {
|
|
4
4
|
it('should perform various operations on a AVL Tree', () => {
|
|
@@ -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,70 @@ 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
|
+
type Datum = { timestamp: Date; temperature: number };
|
|
550
|
+
// Fixed dataset of CPU temperature readings
|
|
551
|
+
const cpuData: Datum[] = [
|
|
552
|
+
{ timestamp: new Date('2024-12-02T00:00:00'), temperature: 55.1 },
|
|
553
|
+
{ timestamp: new Date('2024-12-02T00:01:00'), temperature: 56.3 },
|
|
554
|
+
{ timestamp: new Date('2024-12-02T00:02:00'), temperature: 54.8 },
|
|
555
|
+
{ timestamp: new Date('2024-12-02T00:03:00'), temperature: 57.2 },
|
|
556
|
+
{ timestamp: new Date('2024-12-02T00:04:00'), temperature: 58.0 },
|
|
557
|
+
{ timestamp: new Date('2024-12-02T00:05:00'), temperature: 59.4 },
|
|
558
|
+
{ timestamp: new Date('2024-12-02T00:06:00'), temperature: 60.1 },
|
|
559
|
+
{ timestamp: new Date('2024-12-02T00:07:00'), temperature: 61.3 },
|
|
560
|
+
{ timestamp: new Date('2024-12-02T00:08:00'), temperature: 62.0 },
|
|
561
|
+
{ timestamp: new Date('2024-12-02T00:09:00'), temperature: 63.5 },
|
|
562
|
+
{ timestamp: new Date('2024-12-02T00:10:00'), temperature: 64.0 },
|
|
563
|
+
{ timestamp: new Date('2024-12-02T00:11:00'), temperature: 62.8 },
|
|
564
|
+
{ timestamp: new Date('2024-12-02T00:12:00'), temperature: 61.5 },
|
|
565
|
+
{ timestamp: new Date('2024-12-02T00:13:00'), temperature: 60.2 },
|
|
566
|
+
{ timestamp: new Date('2024-12-02T00:14:00'), temperature: 59.8 },
|
|
567
|
+
{ timestamp: new Date('2024-12-02T00:15:00'), temperature: 58.6 },
|
|
568
|
+
{ timestamp: new Date('2024-12-02T00:16:00'), temperature: 57.4 },
|
|
569
|
+
{ timestamp: new Date('2024-12-02T00:17:00'), temperature: 56.2 },
|
|
570
|
+
{ timestamp: new Date('2024-12-02T00:18:00'), temperature: 55.7 },
|
|
571
|
+
{ timestamp: new Date('2024-12-02T00:19:00'), temperature: 54.5 },
|
|
572
|
+
{ timestamp: new Date('2024-12-02T00:20:00'), temperature: 53.2 },
|
|
573
|
+
{ timestamp: new Date('2024-12-02T00:21:00'), temperature: 52.8 },
|
|
574
|
+
{ timestamp: new Date('2024-12-02T00:22:00'), temperature: 51.9 },
|
|
575
|
+
{ timestamp: new Date('2024-12-02T00:23:00'), temperature: 50.5 },
|
|
576
|
+
{ timestamp: new Date('2024-12-02T00:24:00'), temperature: 49.8 },
|
|
577
|
+
{ timestamp: new Date('2024-12-02T00:25:00'), temperature: 48.7 },
|
|
578
|
+
{ timestamp: new Date('2024-12-02T00:26:00'), temperature: 47.5 },
|
|
579
|
+
{ timestamp: new Date('2024-12-02T00:27:00'), temperature: 46.3 },
|
|
580
|
+
{ timestamp: new Date('2024-12-02T00:28:00'), temperature: 45.9 },
|
|
581
|
+
{ timestamp: new Date('2024-12-02T00:29:00'), temperature: 45.0 }
|
|
582
|
+
];
|
|
583
|
+
|
|
584
|
+
// Create an AVL tree to store CPU temperature data
|
|
585
|
+
const cpuTemperatureTree = new AVLTree<Date, number, Datum>(cpuData, {
|
|
586
|
+
toEntryFn: ({ timestamp, temperature }) => [timestamp, temperature]
|
|
587
|
+
});
|
|
588
|
+
|
|
589
|
+
// Query a specific time range (e.g., from 00:05 to 00:15)
|
|
590
|
+
const rangeStart = new Date('2024-12-02T00:05:00');
|
|
591
|
+
const rangeEnd = new Date('2024-12-02T00:15:00');
|
|
592
|
+
const rangeResults = cpuTemperatureTree.rangeSearch([rangeStart, rangeEnd], node => ({
|
|
593
|
+
minute: node ? node.key.getMinutes() : 0,
|
|
594
|
+
temperature: cpuTemperatureTree.get(node ? node.key : undefined)
|
|
595
|
+
}));
|
|
596
|
+
|
|
597
|
+
expect(rangeResults).toEqual( [
|
|
598
|
+
{ minute: 5, temperature: 59.4 },
|
|
599
|
+
{ minute: 6, temperature: 60.1 },
|
|
600
|
+
{ minute: 7, temperature: 61.3 },
|
|
601
|
+
{ minute: 8, temperature: 62 },
|
|
602
|
+
{ minute: 9, temperature: 63.5 },
|
|
603
|
+
{ minute: 10, temperature: 64 },
|
|
604
|
+
{ minute: 11, temperature: 62.8 },
|
|
605
|
+
{ minute: 12, temperature: 61.5 },
|
|
606
|
+
{ minute: 13, temperature: 60.2 },
|
|
607
|
+
{ minute: 14, temperature: 59.8 },
|
|
608
|
+
{ minute: 15, temperature: 58.6 }
|
|
609
|
+
]);
|
|
610
|
+
});
|
|
611
|
+
});
|
|
@@ -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
|
+
});
|
|
@@ -90,7 +90,7 @@ describe('BST operations test', () => {
|
|
|
90
90
|
expect(nodes.map(node => node.key)).toEqual([15]);
|
|
91
91
|
|
|
92
92
|
let subTreeSum = 0;
|
|
93
|
-
if (node15) bst.dfs(node => (subTreeSum += node.key), 'PRE', 15);
|
|
93
|
+
if (node15) bst.dfs(node => (subTreeSum += node.key), 'PRE', false, 15);
|
|
94
94
|
expect(subTreeSum).toBe(70);
|
|
95
95
|
|
|
96
96
|
let lesserSum = 0;
|
|
@@ -299,7 +299,7 @@ describe('BST operations test', () => {
|
|
|
299
299
|
expect(minNodeBySpecificNode?.key).toBe(12);
|
|
300
300
|
|
|
301
301
|
let subTreeSum = 0;
|
|
302
|
-
if (node15) objBST.dfs(node => (subTreeSum += node.key), 'PRE', node15);
|
|
302
|
+
if (node15) objBST.dfs(node => (subTreeSum += node.key), 'PRE', false, node15);
|
|
303
303
|
expect(subTreeSum).toBe(70);
|
|
304
304
|
|
|
305
305
|
let lesserSum = 0;
|
|
@@ -492,7 +492,7 @@ describe('BST operations test', () => {
|
|
|
492
492
|
|
|
493
493
|
it('should search in range', () => {
|
|
494
494
|
const bst = new BST<number>([10, 5, 15, 3, 7, 12, 18]);
|
|
495
|
-
expect(bst.rangeSearch([4, 12])).toEqual([
|
|
495
|
+
expect(bst.rangeSearch([4, 12])).toEqual([5, 7, 10, 12]);
|
|
496
496
|
expect(() => bst.rangeSearch([12, 4])).toThrow('low must be less than or equal to high');
|
|
497
497
|
expect(bst.rangeSearch([12, 12])).toEqual([12]);
|
|
498
498
|
});
|
|
@@ -535,7 +535,7 @@ describe('BST operations test recursively', () => {
|
|
|
535
535
|
expect(minNodeBySpecificNode?.key).toBe(12);
|
|
536
536
|
|
|
537
537
|
let subTreeSum = 0;
|
|
538
|
-
if (node15) bst.dfs(node => (subTreeSum += node.key), 'PRE', 15);
|
|
538
|
+
if (node15) bst.dfs(node => (subTreeSum += node.key), 'PRE', false, 15);
|
|
539
539
|
expect(subTreeSum).toBe(70);
|
|
540
540
|
|
|
541
541
|
let lesserSum = 0;
|
|
@@ -742,7 +742,7 @@ describe('BST operations test recursively', () => {
|
|
|
742
742
|
expect(minNodeBySpecificNode?.key).toBe(12);
|
|
743
743
|
|
|
744
744
|
let subTreeSum = 0;
|
|
745
|
-
if (node15) objBST.dfs(node => (subTreeSum += node.key), 'PRE', node15);
|
|
745
|
+
if (node15) objBST.dfs(node => (subTreeSum += node.key), 'PRE', false, node15);
|
|
746
746
|
expect(subTreeSum).toBe(70);
|
|
747
747
|
|
|
748
748
|
let lesserSum = 0;
|
|
@@ -1080,10 +1080,10 @@ describe('BST Performance test', function () {
|
|
|
1080
1080
|
it('should dfs as sub tree traversal, null should be ignored', () => {
|
|
1081
1081
|
const bst = new BST();
|
|
1082
1082
|
bst.addMany([4, 2, 6, 1, 3, 5, 7]);
|
|
1083
|
-
expect(bst.dfs(node => node.key, 'PRE', bst.getNode(6), 'ITERATIVE')).toEqual([6, 5, 7]);
|
|
1084
|
-
expect(bst.dfs(node => node.key, 'PRE', bst.getNode(6), 'RECURSIVE')).toEqual([6, 5, 7]);
|
|
1085
|
-
expect(bst.dfs(node => node?.key ?? undefined, 'PRE', bst.getNode(6), 'ITERATIVE')).toEqual([6, 5, 7]);
|
|
1086
|
-
expect(bst.dfs(node => node?.key ?? undefined, 'PRE', bst.getNode(6), 'RECURSIVE')).toEqual([6, 5, 7]);
|
|
1083
|
+
expect(bst.dfs(node => node.key, 'PRE', false, bst.getNode(6), 'ITERATIVE')).toEqual([6, 5, 7]);
|
|
1084
|
+
expect(bst.dfs(node => node.key, 'PRE', false, bst.getNode(6), 'RECURSIVE')).toEqual([6, 5, 7]);
|
|
1085
|
+
expect(bst.dfs(node => node?.key ?? undefined, 'PRE', false, bst.getNode(6), 'ITERATIVE')).toEqual([6, 5, 7]);
|
|
1086
|
+
expect(bst.dfs(node => node?.key ?? undefined, 'PRE', false, bst.getNode(6), 'RECURSIVE')).toEqual([6, 5, 7]);
|
|
1087
1087
|
});
|
|
1088
1088
|
});
|
|
1089
1089
|
|
|
@@ -1565,9 +1565,9 @@ describe('classic use', () => {
|
|
|
1565
1565
|
// Test case for finding elements in a given range
|
|
1566
1566
|
it('@example Find elements in a range', () => {
|
|
1567
1567
|
const bst = new BST<number>([10, 5, 15, 3, 7, 12, 18]);
|
|
1568
|
-
expect(bst.search(new Range(5, 10))).toEqual([
|
|
1569
|
-
expect(bst.rangeSearch([4, 12], node => node.key.toString())).toEqual(['
|
|
1570
|
-
expect(bst.search(new Range(4, 12, true, false))).toEqual([
|
|
1568
|
+
expect(bst.search(new Range(5, 10))).toEqual([5, 7, 10]);
|
|
1569
|
+
expect(bst.rangeSearch([4, 12], node => node.key.toString())).toEqual(['5', '7', '10', '12']);
|
|
1570
|
+
expect(bst.search(new Range(4, 12, true, false))).toEqual([5, 7, 10]);
|
|
1571
1571
|
expect(bst.rangeSearch([15, 20])).toEqual([15, 18]);
|
|
1572
1572
|
expect(bst.search(new Range(15, 20, false))).toEqual([18]);
|
|
1573
1573
|
});
|