data-structure-typed 1.50.3 → 1.50.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -13
- package/CHANGELOG.md +1 -1
- package/README.md +122 -61
- package/README_zh-CN.md +6 -6
- package/SPECIFICATION.md +2 -2
- package/SPECIFICATION_zh-CN.md +81 -0
- package/{SPONSOR-zh-CN.md → SPONSOR_zh-CN.md} +1 -1
- package/benchmark/report.html +24 -24
- package/benchmark/report.json +242 -242
- package/dist/cjs/data-structures/base/iterable-base.d.ts +10 -8
- package/dist/cjs/data-structures/base/iterable-base.js +8 -12
- package/dist/cjs/data-structures/base/iterable-base.js.map +1 -1
- package/dist/{mjs/data-structures/binary-tree/tree-multimap.d.ts → cjs/data-structures/binary-tree/avl-tree-multi-map.d.ts} +11 -11
- package/dist/cjs/data-structures/binary-tree/{tree-multimap.js → avl-tree-multi-map.js} +15 -15
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -0
- package/dist/cjs/data-structures/binary-tree/bst.js +5 -7
- package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/index.d.ts +2 -1
- package/dist/cjs/data-structures/binary-tree/index.js +2 -1
- package/dist/cjs/data-structures/binary-tree/index.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/rb-tree.js +17 -9
- package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.d.ts +200 -0
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.js +400 -0
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.js.map +1 -0
- package/dist/cjs/data-structures/graph/abstract-graph.d.ts +1 -0
- package/dist/cjs/data-structures/graph/abstract-graph.js +3 -0
- package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
- package/dist/cjs/data-structures/heap/heap.js.map +1 -1
- package/dist/cjs/data-structures/linked-list/doubly-linked-list.d.ts +14 -76
- package/dist/cjs/data-structures/linked-list/doubly-linked-list.js +16 -86
- 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 +27 -69
- package/dist/cjs/data-structures/linked-list/singly-linked-list.js +35 -79
- package/dist/cjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
- package/dist/cjs/data-structures/queue/deque.d.ts +0 -53
- package/dist/cjs/data-structures/queue/deque.js +0 -61
- package/dist/cjs/data-structures/queue/deque.js.map +1 -1
- package/dist/cjs/data-structures/queue/queue.d.ts +0 -70
- package/dist/cjs/data-structures/queue/queue.js +0 -87
- package/dist/cjs/data-structures/queue/queue.js.map +1 -1
- package/dist/cjs/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +5 -0
- package/dist/cjs/types/data-structures/binary-tree/avl-tree-multi-map.js +3 -0
- package/dist/cjs/types/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -0
- package/dist/cjs/types/data-structures/binary-tree/index.d.ts +2 -1
- package/dist/cjs/types/data-structures/binary-tree/index.js +2 -1
- package/dist/cjs/types/data-structures/binary-tree/index.js.map +1 -1
- package/dist/cjs/types/data-structures/binary-tree/tree-multi-map.d.ts +5 -0
- package/dist/cjs/types/data-structures/binary-tree/{tree-multimap.js → tree-multi-map.js} +1 -1
- package/dist/cjs/types/data-structures/binary-tree/tree-multi-map.js.map +1 -0
- package/dist/mjs/data-structures/base/iterable-base.d.ts +10 -8
- package/dist/mjs/data-structures/base/iterable-base.js +8 -12
- package/dist/{cjs/data-structures/binary-tree/tree-multimap.d.ts → mjs/data-structures/binary-tree/avl-tree-multi-map.d.ts} +11 -11
- package/dist/mjs/data-structures/binary-tree/{tree-multimap.js → avl-tree-multi-map.js} +11 -11
- package/dist/mjs/data-structures/binary-tree/bst.js +5 -7
- package/dist/mjs/data-structures/binary-tree/index.d.ts +2 -1
- package/dist/mjs/data-structures/binary-tree/index.js +2 -1
- package/dist/mjs/data-structures/binary-tree/rb-tree.js +17 -9
- package/dist/mjs/data-structures/binary-tree/tree-multi-map.d.ts +200 -0
- package/dist/mjs/data-structures/binary-tree/tree-multi-map.js +397 -0
- package/dist/mjs/data-structures/graph/abstract-graph.d.ts +1 -0
- package/dist/mjs/data-structures/graph/abstract-graph.js +3 -0
- package/dist/mjs/data-structures/linked-list/doubly-linked-list.d.ts +14 -76
- package/dist/mjs/data-structures/linked-list/doubly-linked-list.js +16 -86
- package/dist/mjs/data-structures/linked-list/singly-linked-list.d.ts +27 -69
- package/dist/mjs/data-structures/linked-list/singly-linked-list.js +33 -79
- package/dist/mjs/data-structures/queue/deque.d.ts +0 -53
- package/dist/mjs/data-structures/queue/deque.js +0 -61
- package/dist/mjs/data-structures/queue/queue.d.ts +0 -70
- package/dist/mjs/data-structures/queue/queue.js +0 -86
- package/dist/mjs/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +5 -0
- package/dist/mjs/types/data-structures/binary-tree/index.d.ts +2 -1
- package/dist/mjs/types/data-structures/binary-tree/index.js +2 -1
- package/dist/mjs/types/data-structures/binary-tree/tree-multi-map.d.ts +5 -0
- package/dist/mjs/types/data-structures/binary-tree/tree-multi-map.js +1 -0
- package/dist/umd/data-structure-typed.js +461 -354
- package/dist/umd/data-structure-typed.min.js +2 -2
- package/dist/umd/data-structure-typed.min.js.map +1 -1
- package/package.json +1 -1
- package/src/data-structures/base/iterable-base.ts +14 -10
- package/src/data-structures/binary-tree/{tree-multimap.ts → avl-tree-multi-map.ts} +20 -20
- package/src/data-structures/binary-tree/bst.ts +5 -6
- package/src/data-structures/binary-tree/index.ts +2 -1
- package/src/data-structures/binary-tree/rb-tree.ts +20 -10
- package/src/data-structures/binary-tree/tree-multi-map.ts +463 -0
- package/src/data-structures/graph/abstract-graph.ts +4 -0
- package/src/data-structures/heap/heap.ts +1 -1
- package/src/data-structures/linked-list/doubly-linked-list.ts +16 -94
- package/src/data-structures/linked-list/singly-linked-list.ts +35 -87
- package/src/data-structures/queue/deque.ts +0 -67
- package/src/data-structures/queue/queue.ts +0 -98
- package/src/types/data-structures/binary-tree/avl-tree-multi-map.ts +8 -0
- package/src/types/data-structures/binary-tree/index.ts +2 -1
- package/src/types/data-structures/binary-tree/tree-multi-map.ts +8 -0
- package/test/integration/index.html +2 -2
- package/test/performance/data-structures/binary-tree/avl-tree.test.ts +3 -3
- package/test/performance/data-structures/binary-tree/binary-tree-overall.test.ts +3 -3
- package/test/performance/data-structures/hash/hash-map.test.ts +6 -6
- package/test/performance/data-structures/heap/heap.test.ts +14 -14
- package/test/performance/data-structures/priority-queue/priority-queue.test.ts +11 -6
- package/test/performance/data-structures/queue/deque.test.ts +8 -8
- package/test/performance/data-structures/queue/queue.test.ts +5 -12
- package/test/performance/reportor.ts +43 -1
- package/test/unit/data-structures/binary-tree/{tree-multimap.test.ts → avl-tree-multi-map.test.ts} +55 -55
- package/test/unit/data-structures/binary-tree/overall.test.ts +24 -25
- package/test/unit/data-structures/binary-tree/tree-multi-map.test.ts +706 -0
- package/test/unit/data-structures/graph/undirected-graph.test.ts +4 -4
- package/test/unit/data-structures/linked-list/doubly-linked-list.test.ts +6 -6
- package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +10 -10
- package/test/unit/data-structures/linked-list/skip-list.test.ts +4 -4
- package/test/unit/data-structures/queue/deque.test.ts +26 -26
- package/test/unit/data-structures/queue/queue.test.ts +20 -20
- package/test/unit/unrestricted-interconversion.test.ts +3 -3
- package/dist/cjs/data-structures/binary-tree/tree-multimap.js.map +0 -1
- package/dist/cjs/types/data-structures/binary-tree/tree-multimap.d.ts +0 -5
- package/dist/cjs/types/data-structures/binary-tree/tree-multimap.js.map +0 -1
- package/dist/mjs/types/data-structures/binary-tree/tree-multimap.d.ts +0 -5
- package/src/types/data-structures/binary-tree/tree-multimap.ts +0 -8
- /package/dist/mjs/types/data-structures/binary-tree/{tree-multimap.js → avl-tree-multi-map.js} +0 -0
|
@@ -0,0 +1,706 @@
|
|
|
1
|
+
import {
|
|
2
|
+
BinaryTreeNode,
|
|
3
|
+
BSTNode,
|
|
4
|
+
CP,
|
|
5
|
+
IterationType,
|
|
6
|
+
RedBlackTreeNode,
|
|
7
|
+
TreeMultiMap,
|
|
8
|
+
TreeMultiMapNode
|
|
9
|
+
} from '../../../../src';
|
|
10
|
+
import { isDebugTest } from '../../../config';
|
|
11
|
+
|
|
12
|
+
const isDebug = isDebugTest;
|
|
13
|
+
// const isDebug = true;
|
|
14
|
+
|
|
15
|
+
describe('TreeMultiMap count', () => {
|
|
16
|
+
let tm: TreeMultiMap<number>;
|
|
17
|
+
beforeEach(() => {
|
|
18
|
+
tm = new TreeMultiMap<number>();
|
|
19
|
+
});
|
|
20
|
+
it('Should added isolated node count ', () => {
|
|
21
|
+
tm.addMany([
|
|
22
|
+
[1, 1],
|
|
23
|
+
[2, 2],
|
|
24
|
+
[3, 3],
|
|
25
|
+
[4, 4],
|
|
26
|
+
[5, 5]
|
|
27
|
+
]);
|
|
28
|
+
const newNode = new TreeMultiMapNode(3, 33, 10);
|
|
29
|
+
tm.add(newNode);
|
|
30
|
+
expect(tm.count).toBe(15);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('Should count', () => {
|
|
34
|
+
tm.addMany([
|
|
35
|
+
[1, 1],
|
|
36
|
+
[2, 2],
|
|
37
|
+
[3, 3]
|
|
38
|
+
]);
|
|
39
|
+
tm.lesserOrGreaterTraverse(node => (node.count += 2), CP.gt, 1);
|
|
40
|
+
expect(tm.count).toBe(7);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
describe('TreeMultiMap operations test1', () => {
|
|
45
|
+
it('should perform various operations on a Binary Search Tree with numeric values1', () => {
|
|
46
|
+
const treeMultimap = new TreeMultiMap();
|
|
47
|
+
|
|
48
|
+
expect(treeMultimap instanceof TreeMultiMap);
|
|
49
|
+
treeMultimap.add([11, 11]);
|
|
50
|
+
treeMultimap.add([3, 3]);
|
|
51
|
+
const idAndValues: [number, number][] = [
|
|
52
|
+
[11, 11],
|
|
53
|
+
[3, 3],
|
|
54
|
+
[15, 15],
|
|
55
|
+
[1, 1],
|
|
56
|
+
[8, 8],
|
|
57
|
+
[13, 13],
|
|
58
|
+
[16, 16],
|
|
59
|
+
[2, 2],
|
|
60
|
+
[6, 6],
|
|
61
|
+
[9, 9],
|
|
62
|
+
[12, 12],
|
|
63
|
+
[14, 14],
|
|
64
|
+
[4, 4],
|
|
65
|
+
[7, 7],
|
|
66
|
+
[10, 10],
|
|
67
|
+
[5, 5]
|
|
68
|
+
];
|
|
69
|
+
treeMultimap.addMany(idAndValues);
|
|
70
|
+
expect(treeMultimap.root instanceof TreeMultiMapNode);
|
|
71
|
+
|
|
72
|
+
if (treeMultimap.root) expect(treeMultimap.root.key == 11);
|
|
73
|
+
|
|
74
|
+
expect(treeMultimap.size).toBe(16);
|
|
75
|
+
expect(treeMultimap.count).toBe(18);
|
|
76
|
+
|
|
77
|
+
expect(treeMultimap.has(6));
|
|
78
|
+
|
|
79
|
+
expect(treeMultimap.getHeight(6)).toBe(2);
|
|
80
|
+
expect(treeMultimap.getDepth(6)).toBe(4);
|
|
81
|
+
const nodeId10 = treeMultimap.getNode(10);
|
|
82
|
+
expect(nodeId10?.key).toBe(10);
|
|
83
|
+
|
|
84
|
+
const nodeVal9 = treeMultimap.getNode(9, node => node.value);
|
|
85
|
+
expect(nodeVal9?.key).toBe(9);
|
|
86
|
+
|
|
87
|
+
const nodesByCount1 = treeMultimap.getNodes(1, node => node.count);
|
|
88
|
+
expect(nodesByCount1.length).toBe(14);
|
|
89
|
+
|
|
90
|
+
const nodesByCount2 = treeMultimap.getNodes(2, node => node.count);
|
|
91
|
+
expect(nodesByCount2.length).toBe(2);
|
|
92
|
+
const leftMost = treeMultimap.getLeftMost();
|
|
93
|
+
expect(leftMost?.key).toBe(1);
|
|
94
|
+
|
|
95
|
+
const node15 = treeMultimap.getNode(15);
|
|
96
|
+
const minNodeBySpecificNode = node15 && treeMultimap.getLeftMost(node15);
|
|
97
|
+
expect(minNodeBySpecificNode?.key).toBe(15);
|
|
98
|
+
|
|
99
|
+
let subTreeSum = 0;
|
|
100
|
+
node15 && treeMultimap.dfs(node => (subTreeSum += node.key), 'pre', 15);
|
|
101
|
+
expect(subTreeSum).toBe(31);
|
|
102
|
+
let lesserSum = 0;
|
|
103
|
+
treeMultimap.lesserOrGreaterTraverse((node: TreeMultiMapNode<number>) => (lesserSum += node.key), CP.lt, 10);
|
|
104
|
+
expect(lesserSum).toBe(45);
|
|
105
|
+
|
|
106
|
+
expect(node15 instanceof TreeMultiMapNode);
|
|
107
|
+
if (node15 instanceof TreeMultiMapNode) {
|
|
108
|
+
const subTreeAdd = treeMultimap.dfs(node => (node.count += 1), 'pre', 15);
|
|
109
|
+
expect(subTreeAdd);
|
|
110
|
+
}
|
|
111
|
+
const node11 = treeMultimap.getNode(11);
|
|
112
|
+
expect(node11 instanceof TreeMultiMapNode);
|
|
113
|
+
if (node11 instanceof TreeMultiMapNode) {
|
|
114
|
+
const allGreaterNodesAdded = treeMultimap.lesserOrGreaterTraverse(node => (node.count += 2), CP.gt, 11);
|
|
115
|
+
expect(allGreaterNodesAdded);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const dfsInorderNodes = treeMultimap.dfs(node => node, 'in');
|
|
119
|
+
expect(dfsInorderNodes[0].key).toBe(1);
|
|
120
|
+
expect(dfsInorderNodes[dfsInorderNodes.length - 1].key).toBe(16);
|
|
121
|
+
expect(treeMultimap.isPerfectlyBalanced()).toBe(false);
|
|
122
|
+
|
|
123
|
+
treeMultimap.perfectlyBalance();
|
|
124
|
+
|
|
125
|
+
expect(treeMultimap.isPerfectlyBalanced()).toBe(true);
|
|
126
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
127
|
+
|
|
128
|
+
const bfsNodesAfterBalanced = treeMultimap.bfs(node => node);
|
|
129
|
+
expect(bfsNodesAfterBalanced[0].key).toBe(8);
|
|
130
|
+
expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].key).toBe(16);
|
|
131
|
+
|
|
132
|
+
const removed11 = treeMultimap.delete(11, undefined, true);
|
|
133
|
+
expect(removed11 instanceof Array);
|
|
134
|
+
expect(removed11[0]);
|
|
135
|
+
expect(removed11[0].deleted);
|
|
136
|
+
|
|
137
|
+
if (removed11[0].deleted) expect(removed11[0].deleted.key).toBe(11);
|
|
138
|
+
|
|
139
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
140
|
+
|
|
141
|
+
expect(treeMultimap.getHeight(15)).toBe(2);
|
|
142
|
+
|
|
143
|
+
const removed1 = treeMultimap.delete(1, undefined, true);
|
|
144
|
+
expect(removed1 instanceof Array);
|
|
145
|
+
expect(removed1[0]);
|
|
146
|
+
expect(removed1[0].deleted);
|
|
147
|
+
if (removed1[0].deleted) expect(removed1[0].deleted.key).toBe(1);
|
|
148
|
+
|
|
149
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
150
|
+
|
|
151
|
+
expect(treeMultimap.getHeight()).toBe(5);
|
|
152
|
+
|
|
153
|
+
const removed4 = treeMultimap.delete(4, undefined, true);
|
|
154
|
+
expect(removed4 instanceof Array);
|
|
155
|
+
expect(removed4[0]);
|
|
156
|
+
expect(removed4[0].deleted);
|
|
157
|
+
if (removed4[0].deleted) expect(removed4[0].deleted.key).toBe(4);
|
|
158
|
+
|
|
159
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
160
|
+
expect(treeMultimap.getHeight()).toBe(5);
|
|
161
|
+
|
|
162
|
+
const removed10 = treeMultimap.delete(10, undefined, true);
|
|
163
|
+
expect(removed10 instanceof Array);
|
|
164
|
+
expect(removed10[0]);
|
|
165
|
+
expect(removed10[0].deleted);
|
|
166
|
+
if (removed10[0].deleted) expect(removed10[0].deleted.key).toBe(10);
|
|
167
|
+
expect(treeMultimap.isAVLBalanced()).toBe(false);
|
|
168
|
+
|
|
169
|
+
expect(treeMultimap.getHeight()).toBe(5);
|
|
170
|
+
|
|
171
|
+
const removed15 = treeMultimap.delete(15, undefined, true);
|
|
172
|
+
expect(removed15 instanceof Array);
|
|
173
|
+
expect(removed15[0]);
|
|
174
|
+
expect(removed15[0].deleted);
|
|
175
|
+
if (removed15[0].deleted) expect(removed15[0].deleted.key).toBe(15);
|
|
176
|
+
|
|
177
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
178
|
+
expect(treeMultimap.getHeight()).toBe(4);
|
|
179
|
+
|
|
180
|
+
const removed5 = treeMultimap.delete(5, undefined, true);
|
|
181
|
+
expect(removed5 instanceof Array);
|
|
182
|
+
expect(removed5[0]);
|
|
183
|
+
expect(removed5[0].deleted);
|
|
184
|
+
if (removed5[0].deleted) expect(removed5[0].deleted.key).toBe(5);
|
|
185
|
+
|
|
186
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
187
|
+
expect(treeMultimap.getHeight()).toBe(4);
|
|
188
|
+
|
|
189
|
+
const removed13 = treeMultimap.delete(13, undefined, true);
|
|
190
|
+
expect(removed13 instanceof Array);
|
|
191
|
+
expect(removed13[0]);
|
|
192
|
+
expect(removed13[0].deleted);
|
|
193
|
+
if (removed13[0].deleted) expect(removed13[0].deleted.key).toBe(13);
|
|
194
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
195
|
+
expect(treeMultimap.getHeight()).toBe(4);
|
|
196
|
+
|
|
197
|
+
const removed3 = treeMultimap.delete(3, undefined, true);
|
|
198
|
+
expect(removed3 instanceof Array);
|
|
199
|
+
expect(removed3[0]);
|
|
200
|
+
expect(removed3[0].deleted);
|
|
201
|
+
if (removed3[0].deleted) expect(removed3[0].deleted.key).toBe(3);
|
|
202
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
203
|
+
expect(treeMultimap.getHeight()).toBe(4);
|
|
204
|
+
|
|
205
|
+
const removed8 = treeMultimap.delete(8, undefined, true);
|
|
206
|
+
expect(removed8 instanceof Array);
|
|
207
|
+
expect(removed8[0]);
|
|
208
|
+
expect(removed8[0].deleted);
|
|
209
|
+
if (removed8[0].deleted) expect(removed8[0].deleted.key).toBe(8);
|
|
210
|
+
expect(treeMultimap.isAVLBalanced()).toBe(false);
|
|
211
|
+
expect(treeMultimap.getHeight()).toBe(4);
|
|
212
|
+
|
|
213
|
+
const removed6 = treeMultimap.delete(6, undefined, true);
|
|
214
|
+
expect(removed6 instanceof Array);
|
|
215
|
+
expect(removed6[0]);
|
|
216
|
+
expect(removed6[0].deleted);
|
|
217
|
+
if (removed6[0].deleted) expect(removed6[0].deleted.key).toBe(6);
|
|
218
|
+
expect(treeMultimap.delete(6, undefined, true).length).toBe(0);
|
|
219
|
+
expect(treeMultimap.isAVLBalanced()).toBe(false);
|
|
220
|
+
|
|
221
|
+
expect(treeMultimap.getHeight()).toBe(4);
|
|
222
|
+
|
|
223
|
+
const removed7 = treeMultimap.delete(7, undefined, true);
|
|
224
|
+
expect(removed7 instanceof Array);
|
|
225
|
+
expect(removed7[0]);
|
|
226
|
+
expect(removed7[0].deleted);
|
|
227
|
+
if (removed7[0].deleted) expect(removed7[0].deleted.key).toBe(7);
|
|
228
|
+
expect(treeMultimap.isAVLBalanced()).toBe(false);
|
|
229
|
+
expect(treeMultimap.getHeight()).toBe(4);
|
|
230
|
+
|
|
231
|
+
const removed9 = treeMultimap.delete(9, undefined, true);
|
|
232
|
+
expect(removed9 instanceof Array);
|
|
233
|
+
expect(removed9[0]);
|
|
234
|
+
expect(removed9[0].deleted);
|
|
235
|
+
if (removed9[0].deleted) expect(removed9[0].deleted.key).toBe(9);
|
|
236
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
237
|
+
expect(treeMultimap.getHeight()).toBe(3);
|
|
238
|
+
|
|
239
|
+
const removed14 = treeMultimap.delete(14, undefined, true);
|
|
240
|
+
expect(removed14 instanceof Array);
|
|
241
|
+
expect(removed14[0]);
|
|
242
|
+
expect(removed14[0].deleted);
|
|
243
|
+
if (removed14[0].deleted) expect(removed14[0].deleted.key).toBe(14);
|
|
244
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
245
|
+
expect(treeMultimap.getHeight()).toBe(2);
|
|
246
|
+
|
|
247
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
248
|
+
|
|
249
|
+
const bfsIDs = treeMultimap.bfs(node => node.key);
|
|
250
|
+
|
|
251
|
+
expect(bfsIDs[0]).toBe(12);
|
|
252
|
+
expect(bfsIDs[1]).toBe(2);
|
|
253
|
+
expect(bfsIDs[2]).toBe(16);
|
|
254
|
+
|
|
255
|
+
const bfsNodes = treeMultimap.bfs(node => node);
|
|
256
|
+
|
|
257
|
+
expect(bfsNodes[0].key).toBe(12);
|
|
258
|
+
expect(bfsNodes[1].key).toBe(2);
|
|
259
|
+
expect(bfsNodes[2].key).toBe(16);
|
|
260
|
+
|
|
261
|
+
expect(treeMultimap.count).toBe(8);
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
it('should perform various operations on a Binary Search Tree with object values', () => {
|
|
265
|
+
const objTreeMultiMap = new TreeMultiMap<number, { key: number; keyA: number }>();
|
|
266
|
+
expect(objTreeMultiMap).toBeInstanceOf(TreeMultiMap);
|
|
267
|
+
objTreeMultiMap.add([11, { key: 11, keyA: 11 }]);
|
|
268
|
+
objTreeMultiMap.add([3, { key: 3, keyA: 3 }]);
|
|
269
|
+
const values: [number, { key: number; keyA: number }][] = [
|
|
270
|
+
[15, { key: 15, keyA: 15 }],
|
|
271
|
+
[1, { key: 1, keyA: 1 }],
|
|
272
|
+
[8, { key: 8, keyA: 8 }],
|
|
273
|
+
[13, { key: 13, keyA: 13 }],
|
|
274
|
+
[16, { key: 16, keyA: 16 }],
|
|
275
|
+
[2, { key: 2, keyA: 2 }],
|
|
276
|
+
[6, { key: 6, keyA: 6 }],
|
|
277
|
+
[9, { key: 9, keyA: 9 }],
|
|
278
|
+
[12, { key: 12, keyA: 12 }],
|
|
279
|
+
[14, { key: 14, keyA: 14 }],
|
|
280
|
+
[4, { key: 4, keyA: 4 }],
|
|
281
|
+
[7, { key: 7, keyA: 7 }],
|
|
282
|
+
[10, { key: 10, keyA: 10 }],
|
|
283
|
+
[5, { key: 5, keyA: 5 }]
|
|
284
|
+
];
|
|
285
|
+
|
|
286
|
+
objTreeMultiMap.addMany(values);
|
|
287
|
+
|
|
288
|
+
expect(objTreeMultiMap.root).toBeInstanceOf(TreeMultiMapNode);
|
|
289
|
+
|
|
290
|
+
if (objTreeMultiMap.root) expect(objTreeMultiMap.root.key).toBe(11);
|
|
291
|
+
|
|
292
|
+
expect(objTreeMultiMap.count).toBe(16);
|
|
293
|
+
|
|
294
|
+
expect(objTreeMultiMap.has(6)).toBe(true);
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
describe('TreeMultiMap operations test recursively1', () => {
|
|
299
|
+
it('should perform various operations on a Binary Search Tree with numeric values1', () => {
|
|
300
|
+
const treeMultimap = new TreeMultiMap<number>([], { iterationType: IterationType.RECURSIVE });
|
|
301
|
+
|
|
302
|
+
expect(treeMultimap instanceof TreeMultiMap);
|
|
303
|
+
treeMultimap.add([11, 11]);
|
|
304
|
+
treeMultimap.add([3, 3]);
|
|
305
|
+
const idAndValues: [number, number][] = [
|
|
306
|
+
[11, 11],
|
|
307
|
+
[3, 3],
|
|
308
|
+
[15, 15],
|
|
309
|
+
[1, 1],
|
|
310
|
+
[8, 8],
|
|
311
|
+
[13, 13],
|
|
312
|
+
[16, 16],
|
|
313
|
+
[2, 2],
|
|
314
|
+
[6, 6],
|
|
315
|
+
[9, 9],
|
|
316
|
+
[12, 12],
|
|
317
|
+
[14, 14],
|
|
318
|
+
[4, 4],
|
|
319
|
+
[7, 7],
|
|
320
|
+
[10, 10],
|
|
321
|
+
[5, 5]
|
|
322
|
+
];
|
|
323
|
+
treeMultimap.addMany(idAndValues);
|
|
324
|
+
expect(treeMultimap.root).toBeInstanceOf(TreeMultiMapNode);
|
|
325
|
+
|
|
326
|
+
if (treeMultimap.root) expect(treeMultimap.root.key).toBe(11);
|
|
327
|
+
|
|
328
|
+
expect(treeMultimap.size).toBe(16);
|
|
329
|
+
expect(treeMultimap.count).toBe(18);
|
|
330
|
+
|
|
331
|
+
expect(treeMultimap.has(6));
|
|
332
|
+
|
|
333
|
+
expect(treeMultimap.getHeight(6)).toBe(2);
|
|
334
|
+
expect(treeMultimap.getDepth(6)).toBe(4);
|
|
335
|
+
const nodeId10 = treeMultimap.getNode(10);
|
|
336
|
+
expect(nodeId10?.key).toBe(10);
|
|
337
|
+
|
|
338
|
+
const nodeVal9 = treeMultimap.getNode(9, node => node.value);
|
|
339
|
+
expect(nodeVal9?.key).toBe(9);
|
|
340
|
+
|
|
341
|
+
const nodesByCount1 = treeMultimap.getNodes(1, node => node.count);
|
|
342
|
+
expect(nodesByCount1.length).toBe(14);
|
|
343
|
+
|
|
344
|
+
const nodesByCount2 = treeMultimap.getNodes(2, node => node.count);
|
|
345
|
+
expect(nodesByCount2.length).toBe(2);
|
|
346
|
+
const leftMost = treeMultimap.getLeftMost();
|
|
347
|
+
expect(leftMost?.key).toBe(1);
|
|
348
|
+
|
|
349
|
+
const node15 = treeMultimap.getNode(15);
|
|
350
|
+
const minNodeBySpecificNode = node15 && treeMultimap.getLeftMost(node15);
|
|
351
|
+
expect(minNodeBySpecificNode?.key).toBe(15);
|
|
352
|
+
|
|
353
|
+
let subTreeSum = 0;
|
|
354
|
+
node15 && treeMultimap.dfs(node => (subTreeSum += node.key), 'pre', 15);
|
|
355
|
+
expect(subTreeSum).toBe(31);
|
|
356
|
+
let lesserSum = 0;
|
|
357
|
+
expect(treeMultimap.has(9)).toBe(true);
|
|
358
|
+
treeMultimap.lesserOrGreaterTraverse(
|
|
359
|
+
node => {
|
|
360
|
+
lesserSum += node.key;
|
|
361
|
+
return node.key;
|
|
362
|
+
},
|
|
363
|
+
CP.lt,
|
|
364
|
+
10
|
|
365
|
+
);
|
|
366
|
+
expect(lesserSum).toBe(45);
|
|
367
|
+
|
|
368
|
+
expect(node15 instanceof TreeMultiMapNode);
|
|
369
|
+
if (node15 instanceof TreeMultiMapNode) {
|
|
370
|
+
const subTreeAdd = treeMultimap.dfs(node => (node.count += 1), 'pre', 15);
|
|
371
|
+
expect(subTreeAdd);
|
|
372
|
+
}
|
|
373
|
+
const node11 = treeMultimap.getNode(11);
|
|
374
|
+
expect(node11 instanceof TreeMultiMapNode);
|
|
375
|
+
if (node11 instanceof TreeMultiMapNode) {
|
|
376
|
+
const allGreaterNodesAdded = treeMultimap.lesserOrGreaterTraverse(node => (node.count += 2), CP.gt, 11);
|
|
377
|
+
expect(allGreaterNodesAdded);
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
const dfsInorderNodes = treeMultimap.dfs(node => node, 'in');
|
|
381
|
+
expect(dfsInorderNodes[0].key).toBe(1);
|
|
382
|
+
expect(dfsInorderNodes[dfsInorderNodes.length - 1].key).toBe(16);
|
|
383
|
+
expect(treeMultimap.isPerfectlyBalanced()).toBe(false);
|
|
384
|
+
|
|
385
|
+
treeMultimap.perfectlyBalance();
|
|
386
|
+
|
|
387
|
+
expect(treeMultimap.isPerfectlyBalanced()).toBe(true);
|
|
388
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
389
|
+
|
|
390
|
+
const bfsNodesAfterBalanced = treeMultimap.bfs(node => node);
|
|
391
|
+
expect(bfsNodesAfterBalanced[0].key).toBe(8);
|
|
392
|
+
expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].key).toBe(16);
|
|
393
|
+
|
|
394
|
+
const removed11 = treeMultimap.delete(11, undefined, true);
|
|
395
|
+
expect(removed11 instanceof Array);
|
|
396
|
+
expect(removed11[0]);
|
|
397
|
+
expect(removed11[0].deleted);
|
|
398
|
+
|
|
399
|
+
if (removed11[0].deleted) expect(removed11[0].deleted.key).toBe(11);
|
|
400
|
+
|
|
401
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
402
|
+
|
|
403
|
+
expect(treeMultimap.getHeight(15)).toBe(2);
|
|
404
|
+
|
|
405
|
+
const removed1 = treeMultimap.delete(1, undefined, true);
|
|
406
|
+
expect(removed1 instanceof Array);
|
|
407
|
+
expect(removed1[0]);
|
|
408
|
+
expect(removed1[0].deleted);
|
|
409
|
+
if (removed1[0].deleted) expect(removed1[0].deleted.key).toBe(1);
|
|
410
|
+
|
|
411
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
412
|
+
|
|
413
|
+
expect(treeMultimap.getHeight()).toBe(5);
|
|
414
|
+
|
|
415
|
+
const removed4 = treeMultimap.delete(4, undefined, true);
|
|
416
|
+
expect(removed4 instanceof Array);
|
|
417
|
+
expect(removed4[0]);
|
|
418
|
+
expect(removed4[0].deleted);
|
|
419
|
+
if (removed4[0].deleted) expect(removed4[0].deleted.key).toBe(4);
|
|
420
|
+
|
|
421
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
422
|
+
expect(treeMultimap.getHeight()).toBe(5);
|
|
423
|
+
|
|
424
|
+
const removed10 = treeMultimap.delete(10, undefined, true);
|
|
425
|
+
expect(removed10 instanceof Array);
|
|
426
|
+
expect(removed10[0]);
|
|
427
|
+
expect(removed10[0].deleted);
|
|
428
|
+
if (removed10[0].deleted) expect(removed10[0].deleted.key).toBe(10);
|
|
429
|
+
expect(treeMultimap.isAVLBalanced()).toBe(false);
|
|
430
|
+
|
|
431
|
+
expect(treeMultimap.getHeight()).toBe(5);
|
|
432
|
+
|
|
433
|
+
const removed15 = treeMultimap.delete(15, undefined, true);
|
|
434
|
+
expect(removed15 instanceof Array);
|
|
435
|
+
expect(removed15[0]);
|
|
436
|
+
expect(removed15[0].deleted);
|
|
437
|
+
if (removed15[0].deleted) expect(removed15[0].deleted.key).toBe(15);
|
|
438
|
+
|
|
439
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
440
|
+
expect(treeMultimap.getHeight()).toBe(4);
|
|
441
|
+
|
|
442
|
+
const removed5 = treeMultimap.delete(5, undefined, true);
|
|
443
|
+
expect(removed5 instanceof Array);
|
|
444
|
+
expect(removed5[0]);
|
|
445
|
+
expect(removed5[0].deleted);
|
|
446
|
+
if (removed5[0].deleted) expect(removed5[0].deleted.key).toBe(5);
|
|
447
|
+
|
|
448
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
449
|
+
expect(treeMultimap.getHeight()).toBe(4);
|
|
450
|
+
|
|
451
|
+
const removed13 = treeMultimap.delete(13, undefined, true);
|
|
452
|
+
expect(removed13 instanceof Array);
|
|
453
|
+
expect(removed13[0]);
|
|
454
|
+
expect(removed13[0].deleted);
|
|
455
|
+
if (removed13[0].deleted) expect(removed13[0].deleted.key).toBe(13);
|
|
456
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
457
|
+
expect(treeMultimap.getHeight()).toBe(4);
|
|
458
|
+
|
|
459
|
+
const removed3 = treeMultimap.delete(3, undefined, true);
|
|
460
|
+
expect(removed3 instanceof Array);
|
|
461
|
+
expect(removed3[0]);
|
|
462
|
+
expect(removed3[0].deleted);
|
|
463
|
+
if (removed3[0].deleted) expect(removed3[0].deleted.key).toBe(3);
|
|
464
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
465
|
+
expect(treeMultimap.getHeight()).toBe(4);
|
|
466
|
+
|
|
467
|
+
const removed8 = treeMultimap.delete(8, undefined, true);
|
|
468
|
+
expect(removed8 instanceof Array);
|
|
469
|
+
expect(removed8[0]);
|
|
470
|
+
expect(removed8[0].deleted);
|
|
471
|
+
if (removed8[0].deleted) expect(removed8[0].deleted.key).toBe(8);
|
|
472
|
+
expect(treeMultimap.isAVLBalanced()).toBe(false);
|
|
473
|
+
expect(treeMultimap.getHeight()).toBe(4);
|
|
474
|
+
|
|
475
|
+
const removed6 = treeMultimap.delete(6, undefined, true);
|
|
476
|
+
expect(removed6 instanceof Array);
|
|
477
|
+
expect(removed6[0]);
|
|
478
|
+
expect(removed6[0].deleted);
|
|
479
|
+
if (removed6[0].deleted) expect(removed6[0].deleted.key).toBe(6);
|
|
480
|
+
expect(treeMultimap.delete(6, undefined, true).length).toBe(0);
|
|
481
|
+
expect(treeMultimap.isAVLBalanced()).toBe(false);
|
|
482
|
+
|
|
483
|
+
expect(treeMultimap.getHeight()).toBe(4);
|
|
484
|
+
|
|
485
|
+
const removed7 = treeMultimap.delete(7, undefined, true);
|
|
486
|
+
expect(removed7 instanceof Array);
|
|
487
|
+
expect(removed7[0]);
|
|
488
|
+
expect(removed7[0].deleted);
|
|
489
|
+
if (removed7[0].deleted) expect(removed7[0].deleted.key).toBe(7);
|
|
490
|
+
expect(treeMultimap.isAVLBalanced()).toBe(false);
|
|
491
|
+
expect(treeMultimap.getHeight()).toBe(4);
|
|
492
|
+
|
|
493
|
+
const removed9 = treeMultimap.delete(9, undefined, true);
|
|
494
|
+
expect(removed9 instanceof Array);
|
|
495
|
+
expect(removed9[0]);
|
|
496
|
+
expect(removed9[0].deleted);
|
|
497
|
+
if (removed9[0].deleted) expect(removed9[0].deleted.key).toBe(9);
|
|
498
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
499
|
+
expect(treeMultimap.getHeight()).toBe(3);
|
|
500
|
+
|
|
501
|
+
const removed14 = treeMultimap.delete(14, undefined, true);
|
|
502
|
+
expect(removed14 instanceof Array);
|
|
503
|
+
expect(removed14[0]);
|
|
504
|
+
expect(removed14[0].deleted);
|
|
505
|
+
if (removed14[0].deleted) expect(removed14[0].deleted.key).toBe(14);
|
|
506
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
507
|
+
expect(treeMultimap.getHeight()).toBe(2);
|
|
508
|
+
|
|
509
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
510
|
+
|
|
511
|
+
const bfsIDs = treeMultimap.bfs(node => node.key);
|
|
512
|
+
|
|
513
|
+
expect(bfsIDs[0]).toBe(12);
|
|
514
|
+
expect(bfsIDs[1]).toBe(2);
|
|
515
|
+
expect(bfsIDs[2]).toBe(16);
|
|
516
|
+
|
|
517
|
+
const bfsNodes = treeMultimap.bfs(node => node);
|
|
518
|
+
|
|
519
|
+
expect(bfsNodes[0].key).toBe(12);
|
|
520
|
+
expect(bfsNodes[1].key).toBe(2);
|
|
521
|
+
expect(bfsNodes[2].key).toBe(16);
|
|
522
|
+
|
|
523
|
+
expect(treeMultimap.count).toBe(8);
|
|
524
|
+
});
|
|
525
|
+
|
|
526
|
+
it('should perform various operations on a Binary Search Tree with object values', () => {
|
|
527
|
+
const objTreeMultiMap = new TreeMultiMap<number, { key: number; keyA: number }>();
|
|
528
|
+
expect(objTreeMultiMap).toBeInstanceOf(TreeMultiMap);
|
|
529
|
+
objTreeMultiMap.add([11, { key: 11, keyA: 11 }]);
|
|
530
|
+
objTreeMultiMap.add([3, { key: 3, keyA: 3 }]);
|
|
531
|
+
const values: [number, { key: number; keyA: number }][] = [
|
|
532
|
+
[15, { key: 15, keyA: 15 }],
|
|
533
|
+
[1, { key: 1, keyA: 1 }],
|
|
534
|
+
[8, { key: 8, keyA: 8 }],
|
|
535
|
+
[13, { key: 13, keyA: 13 }],
|
|
536
|
+
[16, { key: 16, keyA: 16 }],
|
|
537
|
+
[2, { key: 2, keyA: 2 }],
|
|
538
|
+
[6, { key: 6, keyA: 6 }],
|
|
539
|
+
[9, { key: 9, keyA: 9 }],
|
|
540
|
+
[12, { key: 12, keyA: 12 }],
|
|
541
|
+
[14, { key: 14, keyA: 14 }],
|
|
542
|
+
[4, { key: 4, keyA: 4 }],
|
|
543
|
+
[7, { key: 7, keyA: 7 }],
|
|
544
|
+
[10, { key: 10, keyA: 10 }],
|
|
545
|
+
[5, { key: 5, keyA: 5 }]
|
|
546
|
+
];
|
|
547
|
+
|
|
548
|
+
objTreeMultiMap.addMany(values);
|
|
549
|
+
|
|
550
|
+
expect(objTreeMultiMap.root).toBeInstanceOf(TreeMultiMapNode);
|
|
551
|
+
|
|
552
|
+
if (objTreeMultiMap.root) expect(objTreeMultiMap.root.key).toBe(11);
|
|
553
|
+
|
|
554
|
+
expect(objTreeMultiMap.count).toBe(16);
|
|
555
|
+
|
|
556
|
+
expect(objTreeMultiMap.has(6)).toBe(true);
|
|
557
|
+
});
|
|
558
|
+
});
|
|
559
|
+
|
|
560
|
+
describe('TreeMultiMap Performance test', function () {
|
|
561
|
+
const treeMS = new TreeMultiMap<number, number>();
|
|
562
|
+
const inputSize = 1000; // Adjust input sizes as needed
|
|
563
|
+
|
|
564
|
+
beforeEach(() => {
|
|
565
|
+
treeMS.clear();
|
|
566
|
+
});
|
|
567
|
+
|
|
568
|
+
it(`Observe the time consumption of TreeMultiMap.dfs be good`, function () {
|
|
569
|
+
const startDFS = performance.now();
|
|
570
|
+
const dfs = treeMS.dfs(node => node);
|
|
571
|
+
isDebug && console.log('---bfs', performance.now() - startDFS, dfs.length);
|
|
572
|
+
});
|
|
573
|
+
|
|
574
|
+
it('Should the time consumption of lesserOrGreaterTraverse fitting O(n log n)', function () {
|
|
575
|
+
const start = performance.now();
|
|
576
|
+
for (let i = 0; i < inputSize; i++) {
|
|
577
|
+
treeMS.add(i);
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
isDebug && console.log('---add', performance.now() - start);
|
|
581
|
+
const startL = performance.now();
|
|
582
|
+
treeMS.lesserOrGreaterTraverse(node => (node.count += 1), CP.lt, inputSize / 2);
|
|
583
|
+
isDebug && console.log('---lesserOrGreaterTraverse', performance.now() - startL);
|
|
584
|
+
});
|
|
585
|
+
|
|
586
|
+
it('should the clone method', () => {
|
|
587
|
+
function checkTreeStructure(treeMultimap: TreeMultiMap<string, number>) {
|
|
588
|
+
expect(treeMultimap.size).toBe(4);
|
|
589
|
+
expect(treeMultimap.root?.key).toBe('4');
|
|
590
|
+
expect(treeMultimap.root?.left?.key).toBe('1');
|
|
591
|
+
expect(treeMultimap.root?.left?.left?.key).toBe(NaN);
|
|
592
|
+
expect(treeMultimap.root?.left?.right?.key).toBe('2');
|
|
593
|
+
expect(treeMultimap.root?.right?.key).toBe('5');
|
|
594
|
+
expect(treeMultimap.root?.right?.left?.key).toBe(NaN);
|
|
595
|
+
expect(treeMultimap.root?.right?.right?.key).toBe(NaN);
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
const treeMultimap = new TreeMultiMap<string, number>();
|
|
599
|
+
treeMultimap.addMany([
|
|
600
|
+
['2', 2],
|
|
601
|
+
['4', 4],
|
|
602
|
+
['5', 5],
|
|
603
|
+
['3', 3],
|
|
604
|
+
['1', 1]
|
|
605
|
+
]);
|
|
606
|
+
expect(treeMultimap.size).toBe(5);
|
|
607
|
+
expect(treeMultimap.root?.key).toBe('3');
|
|
608
|
+
expect(treeMultimap.root?.left?.key).toBe('1');
|
|
609
|
+
expect(treeMultimap.root?.left?.left?.key).toBe(NaN);
|
|
610
|
+
expect(treeMultimap.root?.left?.right?.key).toBe('2');
|
|
611
|
+
expect(treeMultimap.root?.right?.key).toBe('4');
|
|
612
|
+
expect(treeMultimap.root?.right?.left?.key).toBe(NaN);
|
|
613
|
+
expect(treeMultimap.root?.right?.right?.key).toBe('5');
|
|
614
|
+
treeMultimap.delete('3');
|
|
615
|
+
checkTreeStructure(treeMultimap);
|
|
616
|
+
const cloned = treeMultimap.clone();
|
|
617
|
+
checkTreeStructure(cloned);
|
|
618
|
+
cloned.delete('1');
|
|
619
|
+
expect(treeMultimap.size).toBe(4);
|
|
620
|
+
expect(cloned.size).toBe(3);
|
|
621
|
+
});
|
|
622
|
+
});
|
|
623
|
+
|
|
624
|
+
describe('TreeMultiMap iterative methods test', () => {
|
|
625
|
+
let treeMM: TreeMultiMap<number, string>;
|
|
626
|
+
beforeEach(() => {
|
|
627
|
+
treeMM = new TreeMultiMap<number, string>();
|
|
628
|
+
treeMM.add(1, 'a', 10);
|
|
629
|
+
treeMM.add([2, 'b'], undefined, 10);
|
|
630
|
+
treeMM.add([3, 'c'], undefined, 1);
|
|
631
|
+
});
|
|
632
|
+
|
|
633
|
+
test('The node obtained by get Node should match the node type', () => {
|
|
634
|
+
const node3 = treeMM.getNode(3);
|
|
635
|
+
expect(node3).toBeInstanceOf(BinaryTreeNode);
|
|
636
|
+
expect(node3).toBeInstanceOf(BSTNode);
|
|
637
|
+
expect(node3).toBeInstanceOf(RedBlackTreeNode);
|
|
638
|
+
});
|
|
639
|
+
|
|
640
|
+
test('forEach should iterate over all elements', () => {
|
|
641
|
+
const mockCallback = jest.fn();
|
|
642
|
+
treeMM.forEach((value, key) => {
|
|
643
|
+
mockCallback(value, key);
|
|
644
|
+
});
|
|
645
|
+
|
|
646
|
+
expect(mockCallback.mock.calls.length).toBe(3);
|
|
647
|
+
expect(mockCallback.mock.calls[0]).toEqual(['a', 1]);
|
|
648
|
+
expect(mockCallback.mock.calls[1]).toEqual(['b', 2]);
|
|
649
|
+
expect(mockCallback.mock.calls[2]).toEqual(['c', 3]);
|
|
650
|
+
});
|
|
651
|
+
|
|
652
|
+
test('filter should return a new tree with filtered elements', () => {
|
|
653
|
+
const filteredTree = treeMM.filter((value, key) => key > 1);
|
|
654
|
+
expect(filteredTree.size).toBe(2);
|
|
655
|
+
expect([...filteredTree]).toEqual([
|
|
656
|
+
[2, 'b'],
|
|
657
|
+
[3, 'c']
|
|
658
|
+
]);
|
|
659
|
+
});
|
|
660
|
+
|
|
661
|
+
test('map should return a new tree with modified elements', () => {
|
|
662
|
+
const mappedTree = treeMM.map((value, key) => (key * 2).toString());
|
|
663
|
+
expect(mappedTree.size).toBe(3);
|
|
664
|
+
expect([...mappedTree]).toEqual([
|
|
665
|
+
[1, '2'],
|
|
666
|
+
[2, '4'],
|
|
667
|
+
[3, '6']
|
|
668
|
+
]);
|
|
669
|
+
});
|
|
670
|
+
|
|
671
|
+
test('reduce should accumulate values', () => {
|
|
672
|
+
const sum = treeMM.reduce((acc, value, key) => acc + key, 0);
|
|
673
|
+
expect(sum).toBe(6);
|
|
674
|
+
});
|
|
675
|
+
|
|
676
|
+
test('[Symbol.iterator] should provide an iterator', () => {
|
|
677
|
+
const entries = [];
|
|
678
|
+
for (const entry of treeMM) {
|
|
679
|
+
entries.push(entry);
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
expect(entries.length).toBe(3);
|
|
683
|
+
expect(entries).toEqual([
|
|
684
|
+
[1, 'a'],
|
|
685
|
+
[2, 'b'],
|
|
686
|
+
[3, 'c']
|
|
687
|
+
]);
|
|
688
|
+
});
|
|
689
|
+
|
|
690
|
+
test('should clone work well', () => {
|
|
691
|
+
expect(treeMM.count).toBe(21);
|
|
692
|
+
const cloned = treeMM.clone();
|
|
693
|
+
expect(cloned.root?.left?.key).toBe(NaN);
|
|
694
|
+
expect(cloned.root?.right?.value).toBe('b');
|
|
695
|
+
});
|
|
696
|
+
|
|
697
|
+
test('should keys', () => {
|
|
698
|
+
const keys = treeMM.keys();
|
|
699
|
+
expect([...keys]).toEqual([1, 2, 3]);
|
|
700
|
+
});
|
|
701
|
+
|
|
702
|
+
test('should values', () => {
|
|
703
|
+
const values = treeMM.values();
|
|
704
|
+
expect([...values]).toEqual(['a', 'b', 'c']);
|
|
705
|
+
});
|
|
706
|
+
});
|