data-structure-typed 1.52.5 → 1.52.7
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/README.md +33 -30
- package/benchmark/report.html +13 -13
- package/benchmark/report.json +156 -156
- package/dist/cjs/constants/index.d.ts +4 -0
- package/dist/cjs/constants/index.js +9 -0
- package/dist/cjs/constants/index.js.map +1 -0
- package/dist/cjs/data-structures/base/iterable-element-base.d.ts +8 -1
- package/dist/cjs/data-structures/base/iterable-element-base.js +10 -1
- package/dist/cjs/data-structures/base/iterable-element-base.js.map +1 -1
- package/dist/cjs/data-structures/base/iterable-entry-base.d.ts +8 -1
- package/dist/cjs/data-structures/base/iterable-entry-base.js +10 -10
- package/dist/cjs/data-structures/base/iterable-entry-base.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +31 -32
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js +43 -44
- 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 +23 -24
- package/dist/cjs/data-structures/binary-tree/avl-tree.js +71 -64
- package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/binary-indexed-tree.js +2 -2
- package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +534 -402
- package/dist/cjs/data-structures/binary-tree/binary-tree.js +669 -598
- package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/bst.d.ts +72 -65
- package/dist/cjs/data-structures/binary-tree/bst.js +115 -113
- package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/rb-tree.d.ts +21 -24
- package/dist/cjs/data-structures/binary-tree/rb-tree.js +40 -39
- package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/segment-tree.d.ts +2 -2
- package/dist/cjs/data-structures/binary-tree/segment-tree.js +2 -2
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.d.ts +28 -31
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.js +44 -43
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.js.map +1 -1
- package/dist/cjs/data-structures/graph/abstract-graph.d.ts +2 -2
- package/dist/cjs/data-structures/graph/abstract-graph.js +7 -4
- package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
- package/dist/cjs/data-structures/graph/directed-graph.d.ts +2 -2
- package/dist/cjs/data-structures/graph/directed-graph.js +4 -2
- package/dist/cjs/data-structures/graph/directed-graph.js.map +1 -1
- package/dist/cjs/data-structures/graph/undirected-graph.d.ts +2 -2
- package/dist/cjs/data-structures/hash/hash-map.d.ts +2 -2
- package/dist/cjs/data-structures/hash/hash-map.js +1 -1
- package/dist/cjs/data-structures/hash/hash-map.js.map +1 -1
- package/dist/cjs/data-structures/heap/heap.js +3 -3
- package/dist/cjs/data-structures/heap/heap.js.map +1 -1
- package/dist/cjs/data-structures/linked-list/doubly-linked-list.d.ts +2 -2
- package/dist/cjs/data-structures/linked-list/doubly-linked-list.js +7 -7
- 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 +2 -2
- package/dist/cjs/data-structures/linked-list/singly-linked-list.js +6 -6
- package/dist/cjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
- package/dist/cjs/data-structures/linked-list/skip-linked-list.d.ts +2 -2
- package/dist/cjs/data-structures/matrix/matrix.d.ts +2 -2
- package/dist/cjs/data-structures/matrix/navigator.d.ts +2 -2
- package/dist/cjs/data-structures/matrix/navigator.js +4 -2
- package/dist/cjs/data-structures/matrix/navigator.js.map +1 -1
- package/dist/cjs/data-structures/queue/deque.d.ts +3 -3
- package/dist/cjs/data-structures/queue/deque.js +29 -29
- package/dist/cjs/data-structures/queue/deque.js.map +1 -1
- package/dist/cjs/data-structures/queue/queue.d.ts +1 -1
- package/dist/cjs/data-structures/stack/stack.d.ts +2 -2
- package/dist/cjs/data-structures/tree/tree.js +2 -0
- package/dist/cjs/data-structures/tree/tree.js.map +1 -1
- package/dist/cjs/data-structures/trie/trie.d.ts +2 -2
- package/dist/cjs/data-structures/trie/trie.js +1 -1
- package/dist/cjs/data-structures/trie/trie.js.map +1 -1
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/interfaces/binary-tree.d.ts +2 -2
- package/dist/cjs/types/data-structures/binary-tree/binary-tree.d.ts +2 -4
- package/dist/cjs/types/data-structures/binary-tree/binary-tree.js +0 -6
- package/dist/cjs/types/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/mjs/constants/index.d.ts +4 -0
- package/dist/mjs/constants/index.js +5 -0
- package/dist/mjs/data-structures/base/iterable-element-base.d.ts +8 -1
- package/dist/mjs/data-structures/base/iterable-element-base.js +10 -1
- package/dist/mjs/data-structures/base/iterable-entry-base.d.ts +8 -1
- package/dist/mjs/data-structures/base/iterable-entry-base.js +10 -10
- package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +31 -32
- package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.js +44 -44
- package/dist/mjs/data-structures/binary-tree/avl-tree.d.ts +23 -24
- package/dist/mjs/data-structures/binary-tree/avl-tree.js +72 -64
- package/dist/mjs/data-structures/binary-tree/binary-indexed-tree.js +2 -2
- package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +534 -402
- package/dist/mjs/data-structures/binary-tree/binary-tree.js +668 -592
- package/dist/mjs/data-structures/binary-tree/bst.d.ts +72 -65
- package/dist/mjs/data-structures/binary-tree/bst.js +116 -112
- package/dist/mjs/data-structures/binary-tree/rb-tree.d.ts +21 -24
- package/dist/mjs/data-structures/binary-tree/rb-tree.js +41 -38
- package/dist/mjs/data-structures/binary-tree/segment-tree.d.ts +2 -2
- package/dist/mjs/data-structures/binary-tree/segment-tree.js +2 -2
- package/dist/mjs/data-structures/binary-tree/tree-multi-map.d.ts +28 -31
- package/dist/mjs/data-structures/binary-tree/tree-multi-map.js +45 -42
- package/dist/mjs/data-structures/graph/abstract-graph.d.ts +2 -2
- package/dist/mjs/data-structures/graph/abstract-graph.js +7 -4
- package/dist/mjs/data-structures/graph/directed-graph.d.ts +2 -2
- package/dist/mjs/data-structures/graph/directed-graph.js +4 -2
- package/dist/mjs/data-structures/graph/undirected-graph.d.ts +2 -2
- package/dist/mjs/data-structures/hash/hash-map.d.ts +2 -2
- package/dist/mjs/data-structures/hash/hash-map.js +1 -1
- package/dist/mjs/data-structures/heap/heap.js +3 -3
- package/dist/mjs/data-structures/linked-list/doubly-linked-list.d.ts +2 -2
- package/dist/mjs/data-structures/linked-list/doubly-linked-list.js +7 -7
- package/dist/mjs/data-structures/linked-list/singly-linked-list.d.ts +2 -2
- package/dist/mjs/data-structures/linked-list/singly-linked-list.js +6 -6
- package/dist/mjs/data-structures/linked-list/skip-linked-list.d.ts +2 -2
- package/dist/mjs/data-structures/matrix/matrix.d.ts +2 -2
- package/dist/mjs/data-structures/matrix/navigator.d.ts +2 -2
- package/dist/mjs/data-structures/matrix/navigator.js +4 -2
- package/dist/mjs/data-structures/queue/deque.d.ts +3 -3
- package/dist/mjs/data-structures/queue/deque.js +29 -29
- package/dist/mjs/data-structures/queue/queue.d.ts +1 -1
- package/dist/mjs/data-structures/stack/stack.d.ts +2 -2
- package/dist/mjs/data-structures/tree/tree.js +2 -0
- package/dist/mjs/data-structures/trie/trie.d.ts +2 -2
- package/dist/mjs/data-structures/trie/trie.js +1 -1
- package/dist/mjs/index.d.ts +1 -0
- package/dist/mjs/index.js +1 -0
- package/dist/mjs/interfaces/binary-tree.d.ts +2 -2
- package/dist/mjs/types/data-structures/binary-tree/binary-tree.d.ts +2 -4
- package/dist/mjs/types/data-structures/binary-tree/binary-tree.js +1 -5
- package/dist/umd/data-structure-typed.js +1344 -1614
- package/dist/umd/data-structure-typed.min.js +10 -3
- package/dist/umd/data-structure-typed.min.js.map +1 -1
- package/eslint.config.mjs +69 -0
- package/package.json +30 -28
- package/src/constants/index.ts +4 -0
- package/src/data-structures/base/iterable-element-base.ts +11 -1
- package/src/data-structures/base/iterable-entry-base.ts +11 -19
- package/src/data-structures/binary-tree/avl-tree-multi-map.ts +47 -50
- package/src/data-structures/binary-tree/avl-tree.ts +69 -71
- package/src/data-structures/binary-tree/binary-indexed-tree.ts +2 -2
- package/src/data-structures/binary-tree/binary-tree.ts +698 -726
- package/src/data-structures/binary-tree/bst.ts +123 -129
- package/src/data-structures/binary-tree/rb-tree.ts +44 -46
- package/src/data-structures/binary-tree/segment-tree.ts +2 -2
- package/src/data-structures/binary-tree/tree-multi-map.ts +48 -49
- package/src/data-structures/graph/abstract-graph.ts +6 -6
- package/src/data-structures/graph/directed-graph.ts +4 -4
- package/src/data-structures/graph/undirected-graph.ts +2 -2
- package/src/data-structures/hash/hash-map.ts +3 -3
- package/src/data-structures/heap/heap.ts +3 -3
- package/src/data-structures/linked-list/doubly-linked-list.ts +9 -9
- package/src/data-structures/linked-list/singly-linked-list.ts +8 -8
- package/src/data-structures/linked-list/skip-linked-list.ts +2 -2
- package/src/data-structures/matrix/matrix.ts +2 -2
- package/src/data-structures/matrix/navigator.ts +4 -4
- package/src/data-structures/queue/deque.ts +31 -31
- package/src/data-structures/queue/queue.ts +1 -1
- package/src/data-structures/stack/stack.ts +2 -2
- package/src/data-structures/trie/trie.ts +3 -3
- package/src/index.ts +1 -0
- package/src/interfaces/binary-tree.ts +3 -3
- package/src/types/data-structures/binary-tree/binary-tree.ts +3 -5
- package/test/config.ts +1 -7
- package/test/integration/all-in-one.test.ts +2 -2
- package/test/integration/avl-tree.test.ts +3 -3
- package/test/integration/bst.test.ts +19 -18
- package/test/integration/heap.test.js +6 -1
- package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +39 -39
- package/test/unit/data-structures/binary-tree/avl-tree.test.ts +2 -2
- package/test/unit/data-structures/binary-tree/binary-tree.test.ts +140 -112
- package/test/unit/data-structures/binary-tree/bst.test.ts +41 -13
- package/test/unit/data-structures/binary-tree/overall.test.ts +0 -6
- package/test/unit/data-structures/binary-tree/rb-tree.test.ts +6 -6
- package/test/unit/data-structures/binary-tree/segment-tree.test.ts +88 -34
- package/test/unit/data-structures/binary-tree/tree-multi-map.test.ts +42 -42
- package/test/unit/data-structures/graph/abstract-graph.test.ts +1 -1
- package/test/unit/data-structures/graph/directed-graph.test.ts +4 -4
- package/test/unit/data-structures/graph/undirected-graph.test.ts +14 -2
- package/test/unit/data-structures/hash/hash-map.test.ts +1 -1
- package/test/unit/data-structures/linked-list/doubly-linked-list.test.ts +1 -1
- package/test/unit/data-structures/matrix/navigator.test.ts +2 -2
- package/test/unit/data-structures/priority-queue/min-priority-queue.test.ts +1 -1
- package/test/unit/data-structures/priority-queue/priority-queue.test.ts +4 -4
- package/test/unit/data-structures/stack/stack.test.ts +6 -0
- package/test/unit/unrestricted-interconversion.test.ts +24 -24
- package/test/utils/big-o.ts +5 -4
- package/.eslintrc.js +0 -64
|
@@ -75,13 +75,13 @@ describe('AVLTreeMultiMap operations test1', () => {
|
|
|
75
75
|
const nodeId10 = treeMultimap.getNode(10);
|
|
76
76
|
expect(nodeId10?.key).toBe(10);
|
|
77
77
|
|
|
78
|
-
const nodeVal9 = treeMultimap.getNode(
|
|
78
|
+
const nodeVal9 = treeMultimap.getNode(node => node.value === 9);
|
|
79
79
|
expect(nodeVal9?.key).toBe(9);
|
|
80
80
|
|
|
81
|
-
const nodesByCount1 = treeMultimap.getNodes(
|
|
81
|
+
const nodesByCount1 = treeMultimap.getNodes(node => node.count === 1);
|
|
82
82
|
expect(nodesByCount1.length).toBe(14);
|
|
83
83
|
|
|
84
|
-
const nodesByCount2 = treeMultimap.getNodes(
|
|
84
|
+
const nodesByCount2 = treeMultimap.getNodes(node => node.count === 2);
|
|
85
85
|
expect(nodesByCount2.length).toBe(2);
|
|
86
86
|
const leftMost = treeMultimap.getLeftMost();
|
|
87
87
|
expect(leftMost).toBe(1);
|
|
@@ -91,7 +91,7 @@ describe('AVLTreeMultiMap operations test1', () => {
|
|
|
91
91
|
expect(minNodeBySpecificNode?.key).toBe(15);
|
|
92
92
|
|
|
93
93
|
let subTreeSum = 0;
|
|
94
|
-
node15
|
|
94
|
+
if (node15) treeMultimap.dfs(node => (subTreeSum += node.key), 'PRE', 15);
|
|
95
95
|
expect(subTreeSum).toBe(31);
|
|
96
96
|
let lesserSum = 0;
|
|
97
97
|
treeMultimap.lesserOrGreaterTraverse((node: AVLTreeMultiMapNode<number>) => (lesserSum += node.key), -1, 10);
|
|
@@ -123,7 +123,7 @@ describe('AVLTreeMultiMap operations test1', () => {
|
|
|
123
123
|
expect(bfsNodesAfterBalanced[0].key).toBe(8);
|
|
124
124
|
expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].key).toBe(16);
|
|
125
125
|
|
|
126
|
-
const removed11 = treeMultimap.delete(11,
|
|
126
|
+
const removed11 = treeMultimap.delete(11, true);
|
|
127
127
|
expect(removed11 instanceof Array);
|
|
128
128
|
expect(removed11[0]);
|
|
129
129
|
expect(removed11[0].deleted);
|
|
@@ -134,7 +134,7 @@ describe('AVLTreeMultiMap operations test1', () => {
|
|
|
134
134
|
|
|
135
135
|
expect(treeMultimap.getHeight(15)).toBe(1);
|
|
136
136
|
|
|
137
|
-
const removed1 = treeMultimap.delete(1,
|
|
137
|
+
const removed1 = treeMultimap.delete(1, true);
|
|
138
138
|
expect(removed1 instanceof Array);
|
|
139
139
|
expect(removed1[0]);
|
|
140
140
|
expect(removed1[0].deleted);
|
|
@@ -144,7 +144,7 @@ describe('AVLTreeMultiMap operations test1', () => {
|
|
|
144
144
|
|
|
145
145
|
expect(treeMultimap.getHeight()).toBe(4);
|
|
146
146
|
|
|
147
|
-
const removed4 = treeMultimap.delete(4,
|
|
147
|
+
const removed4 = treeMultimap.delete(4, true);
|
|
148
148
|
expect(removed4 instanceof Array);
|
|
149
149
|
expect(removed4[0]);
|
|
150
150
|
expect(removed4[0].deleted);
|
|
@@ -153,7 +153,7 @@ describe('AVLTreeMultiMap operations test1', () => {
|
|
|
153
153
|
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
154
154
|
expect(treeMultimap.getHeight()).toBe(4);
|
|
155
155
|
|
|
156
|
-
const removed10 = treeMultimap.delete(10,
|
|
156
|
+
const removed10 = treeMultimap.delete(10, true);
|
|
157
157
|
expect(removed10 instanceof Array);
|
|
158
158
|
expect(removed10[0]);
|
|
159
159
|
expect(removed10[0].deleted);
|
|
@@ -162,7 +162,7 @@ describe('AVLTreeMultiMap operations test1', () => {
|
|
|
162
162
|
|
|
163
163
|
expect(treeMultimap.getHeight()).toBe(3);
|
|
164
164
|
|
|
165
|
-
const removed15 = treeMultimap.delete(15,
|
|
165
|
+
const removed15 = treeMultimap.delete(15, true);
|
|
166
166
|
expect(removed15 instanceof Array);
|
|
167
167
|
expect(removed15[0]);
|
|
168
168
|
expect(removed15[0].deleted);
|
|
@@ -171,7 +171,7 @@ describe('AVLTreeMultiMap operations test1', () => {
|
|
|
171
171
|
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
172
172
|
expect(treeMultimap.getHeight()).toBe(3);
|
|
173
173
|
|
|
174
|
-
const removed5 = treeMultimap.delete(5,
|
|
174
|
+
const removed5 = treeMultimap.delete(5, true);
|
|
175
175
|
expect(removed5 instanceof Array);
|
|
176
176
|
expect(removed5[0]);
|
|
177
177
|
expect(removed5[0].deleted);
|
|
@@ -180,7 +180,7 @@ describe('AVLTreeMultiMap operations test1', () => {
|
|
|
180
180
|
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
181
181
|
expect(treeMultimap.getHeight()).toBe(3);
|
|
182
182
|
|
|
183
|
-
const removed13 = treeMultimap.delete(13,
|
|
183
|
+
const removed13 = treeMultimap.delete(13, true);
|
|
184
184
|
expect(removed13 instanceof Array);
|
|
185
185
|
expect(removed13[0]);
|
|
186
186
|
expect(removed13[0].deleted);
|
|
@@ -188,7 +188,7 @@ describe('AVLTreeMultiMap operations test1', () => {
|
|
|
188
188
|
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
189
189
|
expect(treeMultimap.getHeight()).toBe(3);
|
|
190
190
|
|
|
191
|
-
const removed3 = treeMultimap.delete(3,
|
|
191
|
+
const removed3 = treeMultimap.delete(3, true);
|
|
192
192
|
expect(removed3 instanceof Array);
|
|
193
193
|
expect(removed3[0]);
|
|
194
194
|
expect(removed3[0].deleted);
|
|
@@ -196,7 +196,7 @@ describe('AVLTreeMultiMap operations test1', () => {
|
|
|
196
196
|
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
197
197
|
expect(treeMultimap.getHeight()).toBe(3);
|
|
198
198
|
|
|
199
|
-
const removed8 = treeMultimap.delete(8,
|
|
199
|
+
const removed8 = treeMultimap.delete(8, true);
|
|
200
200
|
expect(removed8 instanceof Array);
|
|
201
201
|
expect(removed8[0]);
|
|
202
202
|
expect(removed8[0].deleted);
|
|
@@ -204,17 +204,17 @@ describe('AVLTreeMultiMap operations test1', () => {
|
|
|
204
204
|
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
205
205
|
expect(treeMultimap.getHeight()).toBe(3);
|
|
206
206
|
|
|
207
|
-
const removed6 = treeMultimap.delete(6,
|
|
207
|
+
const removed6 = treeMultimap.delete(6, true);
|
|
208
208
|
expect(removed6 instanceof Array);
|
|
209
209
|
expect(removed6[0]);
|
|
210
210
|
expect(removed6[0].deleted);
|
|
211
211
|
if (removed6[0].deleted) expect(removed6[0].deleted.key).toBe(6);
|
|
212
|
-
expect(treeMultimap.delete(6,
|
|
212
|
+
expect(treeMultimap.delete(6, true).length).toBe(0);
|
|
213
213
|
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
214
214
|
|
|
215
215
|
expect(treeMultimap.getHeight()).toBe(2);
|
|
216
216
|
|
|
217
|
-
const removed7 = treeMultimap.delete(7,
|
|
217
|
+
const removed7 = treeMultimap.delete(7, true);
|
|
218
218
|
expect(removed7 instanceof Array);
|
|
219
219
|
expect(removed7[0]);
|
|
220
220
|
expect(removed7[0].deleted);
|
|
@@ -222,7 +222,7 @@ describe('AVLTreeMultiMap operations test1', () => {
|
|
|
222
222
|
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
223
223
|
expect(treeMultimap.getHeight()).toBe(2);
|
|
224
224
|
|
|
225
|
-
const removed9 = treeMultimap.delete(9,
|
|
225
|
+
const removed9 = treeMultimap.delete(9, true);
|
|
226
226
|
expect(removed9 instanceof Array);
|
|
227
227
|
expect(removed9[0]);
|
|
228
228
|
expect(removed9[0].deleted);
|
|
@@ -230,7 +230,7 @@ describe('AVLTreeMultiMap operations test1', () => {
|
|
|
230
230
|
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
231
231
|
expect(treeMultimap.getHeight()).toBe(2);
|
|
232
232
|
|
|
233
|
-
const removed14 = treeMultimap.delete(14,
|
|
233
|
+
const removed14 = treeMultimap.delete(14, true);
|
|
234
234
|
expect(removed14 instanceof Array);
|
|
235
235
|
expect(removed14[0]);
|
|
236
236
|
expect(removed14[0].deleted);
|
|
@@ -331,13 +331,13 @@ describe('AVLTreeMultiMap operations test recursively1', () => {
|
|
|
331
331
|
const nodeId10 = treeMultimap.getNode(10);
|
|
332
332
|
expect(nodeId10?.key).toBe(10);
|
|
333
333
|
|
|
334
|
-
const nodeVal9 = treeMultimap.getNode(
|
|
334
|
+
const nodeVal9 = treeMultimap.getNode(node => node.value === 9);
|
|
335
335
|
expect(nodeVal9?.key).toBe(9);
|
|
336
336
|
|
|
337
|
-
const nodesByCount1 = treeMultimap.getNodes(
|
|
337
|
+
const nodesByCount1 = treeMultimap.getNodes(node => node.count === 1);
|
|
338
338
|
expect(nodesByCount1.length).toBe(14);
|
|
339
339
|
|
|
340
|
-
const nodesByCount2 = treeMultimap.getNodes(
|
|
340
|
+
const nodesByCount2 = treeMultimap.getNodes(node => node.count === 2);
|
|
341
341
|
expect(nodesByCount2.length).toBe(2);
|
|
342
342
|
const leftMost = treeMultimap.getLeftMost();
|
|
343
343
|
expect(leftMost).toBe(1);
|
|
@@ -347,7 +347,7 @@ describe('AVLTreeMultiMap operations test recursively1', () => {
|
|
|
347
347
|
expect(minNodeBySpecificNode?.key).toBe(15);
|
|
348
348
|
|
|
349
349
|
let subTreeSum = 0;
|
|
350
|
-
node15
|
|
350
|
+
if (node15) treeMultimap.dfs(node => (subTreeSum += node.key), 'PRE', 15);
|
|
351
351
|
expect(subTreeSum).toBe(31);
|
|
352
352
|
let lesserSum = 0;
|
|
353
353
|
treeMultimap.lesserOrGreaterTraverse((node: AVLTreeMultiMapNode<number>) => (lesserSum += node.key), -1, 10);
|
|
@@ -379,7 +379,7 @@ describe('AVLTreeMultiMap operations test recursively1', () => {
|
|
|
379
379
|
expect(bfsNodesAfterBalanced[0].key).toBe(8);
|
|
380
380
|
expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].key).toBe(16);
|
|
381
381
|
|
|
382
|
-
const removed11 = treeMultimap.delete(11,
|
|
382
|
+
const removed11 = treeMultimap.delete(11, true);
|
|
383
383
|
expect(removed11 instanceof Array);
|
|
384
384
|
expect(removed11[0]);
|
|
385
385
|
expect(removed11[0].deleted);
|
|
@@ -390,7 +390,7 @@ describe('AVLTreeMultiMap operations test recursively1', () => {
|
|
|
390
390
|
|
|
391
391
|
expect(treeMultimap.getHeight(15)).toBe(1);
|
|
392
392
|
|
|
393
|
-
const removed1 = treeMultimap.delete(1,
|
|
393
|
+
const removed1 = treeMultimap.delete(1, true);
|
|
394
394
|
expect(removed1 instanceof Array);
|
|
395
395
|
expect(removed1[0]);
|
|
396
396
|
expect(removed1[0].deleted);
|
|
@@ -400,7 +400,7 @@ describe('AVLTreeMultiMap operations test recursively1', () => {
|
|
|
400
400
|
|
|
401
401
|
expect(treeMultimap.getHeight()).toBe(4);
|
|
402
402
|
|
|
403
|
-
const removed4 = treeMultimap.delete(4,
|
|
403
|
+
const removed4 = treeMultimap.delete(4, true);
|
|
404
404
|
expect(removed4 instanceof Array);
|
|
405
405
|
expect(removed4[0]);
|
|
406
406
|
expect(removed4[0].deleted);
|
|
@@ -409,7 +409,7 @@ describe('AVLTreeMultiMap operations test recursively1', () => {
|
|
|
409
409
|
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
410
410
|
expect(treeMultimap.getHeight()).toBe(4);
|
|
411
411
|
|
|
412
|
-
const removed10 = treeMultimap.delete(10,
|
|
412
|
+
const removed10 = treeMultimap.delete(10, true);
|
|
413
413
|
expect(removed10 instanceof Array);
|
|
414
414
|
expect(removed10[0]);
|
|
415
415
|
expect(removed10[0].deleted);
|
|
@@ -418,7 +418,7 @@ describe('AVLTreeMultiMap operations test recursively1', () => {
|
|
|
418
418
|
|
|
419
419
|
expect(treeMultimap.getHeight()).toBe(3);
|
|
420
420
|
|
|
421
|
-
const removed15 = treeMultimap.delete(15,
|
|
421
|
+
const removed15 = treeMultimap.delete(15, true);
|
|
422
422
|
expect(removed15 instanceof Array);
|
|
423
423
|
expect(removed15[0]);
|
|
424
424
|
expect(removed15[0].deleted);
|
|
@@ -427,7 +427,7 @@ describe('AVLTreeMultiMap operations test recursively1', () => {
|
|
|
427
427
|
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
428
428
|
expect(treeMultimap.getHeight()).toBe(3);
|
|
429
429
|
|
|
430
|
-
const removed5 = treeMultimap.delete(5,
|
|
430
|
+
const removed5 = treeMultimap.delete(5, true);
|
|
431
431
|
expect(removed5 instanceof Array);
|
|
432
432
|
expect(removed5[0]);
|
|
433
433
|
expect(removed5[0].deleted);
|
|
@@ -436,7 +436,7 @@ describe('AVLTreeMultiMap operations test recursively1', () => {
|
|
|
436
436
|
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
437
437
|
expect(treeMultimap.getHeight()).toBe(3);
|
|
438
438
|
|
|
439
|
-
const removed13 = treeMultimap.delete(13,
|
|
439
|
+
const removed13 = treeMultimap.delete(13, true);
|
|
440
440
|
expect(removed13 instanceof Array);
|
|
441
441
|
expect(removed13[0]);
|
|
442
442
|
expect(removed13[0].deleted);
|
|
@@ -444,7 +444,7 @@ describe('AVLTreeMultiMap operations test recursively1', () => {
|
|
|
444
444
|
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
445
445
|
expect(treeMultimap.getHeight()).toBe(3);
|
|
446
446
|
|
|
447
|
-
const removed3 = treeMultimap.delete(3,
|
|
447
|
+
const removed3 = treeMultimap.delete(3, true);
|
|
448
448
|
expect(removed3 instanceof Array);
|
|
449
449
|
expect(removed3[0]);
|
|
450
450
|
expect(removed3[0].deleted);
|
|
@@ -452,7 +452,7 @@ describe('AVLTreeMultiMap operations test recursively1', () => {
|
|
|
452
452
|
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
453
453
|
expect(treeMultimap.getHeight()).toBe(3);
|
|
454
454
|
|
|
455
|
-
const removed8 = treeMultimap.delete(8,
|
|
455
|
+
const removed8 = treeMultimap.delete(8, true);
|
|
456
456
|
expect(removed8 instanceof Array);
|
|
457
457
|
expect(removed8[0]);
|
|
458
458
|
expect(removed8[0].deleted);
|
|
@@ -460,17 +460,17 @@ describe('AVLTreeMultiMap operations test recursively1', () => {
|
|
|
460
460
|
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
461
461
|
expect(treeMultimap.getHeight()).toBe(3);
|
|
462
462
|
|
|
463
|
-
const removed6 = treeMultimap.delete(6,
|
|
463
|
+
const removed6 = treeMultimap.delete(6, true);
|
|
464
464
|
expect(removed6 instanceof Array);
|
|
465
465
|
expect(removed6[0]);
|
|
466
466
|
expect(removed6[0].deleted);
|
|
467
467
|
if (removed6[0].deleted) expect(removed6[0].deleted.key).toBe(6);
|
|
468
|
-
expect(treeMultimap.delete(6,
|
|
468
|
+
expect(treeMultimap.delete(6, true).length).toBe(0);
|
|
469
469
|
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
470
470
|
|
|
471
471
|
expect(treeMultimap.getHeight()).toBe(2);
|
|
472
472
|
|
|
473
|
-
const removed7 = treeMultimap.delete(7,
|
|
473
|
+
const removed7 = treeMultimap.delete(7, true);
|
|
474
474
|
expect(removed7 instanceof Array);
|
|
475
475
|
expect(removed7[0]);
|
|
476
476
|
expect(removed7[0].deleted);
|
|
@@ -478,7 +478,7 @@ describe('AVLTreeMultiMap operations test recursively1', () => {
|
|
|
478
478
|
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
479
479
|
expect(treeMultimap.getHeight()).toBe(2);
|
|
480
480
|
|
|
481
|
-
const removed9 = treeMultimap.delete(9,
|
|
481
|
+
const removed9 = treeMultimap.delete(9, true);
|
|
482
482
|
expect(removed9 instanceof Array);
|
|
483
483
|
expect(removed9[0]);
|
|
484
484
|
expect(removed9[0].deleted);
|
|
@@ -486,7 +486,7 @@ describe('AVLTreeMultiMap operations test recursively1', () => {
|
|
|
486
486
|
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
487
487
|
expect(treeMultimap.getHeight()).toBe(2);
|
|
488
488
|
|
|
489
|
-
const removed14 = treeMultimap.delete(14,
|
|
489
|
+
const removed14 = treeMultimap.delete(14, true);
|
|
490
490
|
expect(removed14 instanceof Array);
|
|
491
491
|
expect(removed14[0]);
|
|
492
492
|
expect(removed14[0].deleted);
|
|
@@ -556,7 +556,7 @@ describe('AVLTreeMultiMap Performance test', function () {
|
|
|
556
556
|
it(`Observe the time consumption of AVLTreeMultiMap.dfs be good`, function () {
|
|
557
557
|
const startDFS = performance.now();
|
|
558
558
|
const dfs = treeMS.dfs(node => node);
|
|
559
|
-
isDebug
|
|
559
|
+
if (isDebug) console.log('---bfs', performance.now() - startDFS, dfs.length);
|
|
560
560
|
});
|
|
561
561
|
|
|
562
562
|
it('Should the time consumption of lesserOrGreaterTraverse fitting O(n log n)', function () {
|
|
@@ -564,10 +564,10 @@ describe('AVLTreeMultiMap Performance test', function () {
|
|
|
564
564
|
for (let i = 0; i < inputSize; i++) {
|
|
565
565
|
treeMS.add(i);
|
|
566
566
|
}
|
|
567
|
-
isDebug
|
|
567
|
+
if (isDebug) console.log('---add', performance.now() - start);
|
|
568
568
|
const startL = performance.now();
|
|
569
569
|
treeMS.lesserOrGreaterTraverse(node => (node.count += 1), -1, inputSize / 2);
|
|
570
|
-
isDebug
|
|
570
|
+
if (isDebug) console.log('---lesserOrGreaterTraverse', performance.now() - startL);
|
|
571
571
|
});
|
|
572
572
|
|
|
573
573
|
it('should the clone method', () => {
|
|
@@ -24,7 +24,7 @@ describe('AVL Tree Test', () => {
|
|
|
24
24
|
expect(getMinNodeBySpecificNode?.key).toBe(12);
|
|
25
25
|
|
|
26
26
|
let subTreeSum = 0;
|
|
27
|
-
node15
|
|
27
|
+
if (node15) tree.dfs(node => (subTreeSum += node.key), 'PRE', node15);
|
|
28
28
|
expect(subTreeSum).toBe(70);
|
|
29
29
|
|
|
30
30
|
let lesserSum = 0;
|
|
@@ -132,7 +132,7 @@ describe('AVL Tree Test recursively', () => {
|
|
|
132
132
|
expect(getMinNodeBySpecificNode?.key).toBe(12);
|
|
133
133
|
|
|
134
134
|
let subTreeSum = 0;
|
|
135
|
-
node15
|
|
135
|
+
if (node15) tree.dfs(node => (subTreeSum += node.key), 'PRE', node15);
|
|
136
136
|
expect(subTreeSum).toBe(70);
|
|
137
137
|
|
|
138
138
|
let lesserSum = 0;
|
|
@@ -169,8 +169,8 @@ describe('BinaryTree', () => {
|
|
|
169
169
|
expect(tree.has(4)).toBe(false);
|
|
170
170
|
const node4 = tree.getNode(4);
|
|
171
171
|
expect(tree.has(node4)).toBe(false);
|
|
172
|
-
expect(tree.has(
|
|
173
|
-
expect(tree.has(
|
|
172
|
+
expect(tree.has(node => node === node4)).toBe(false);
|
|
173
|
+
expect(tree.has(node => node.value?.toString() === '3')).toBe(true);
|
|
174
174
|
});
|
|
175
175
|
|
|
176
176
|
it('should the clone method work fine', () => {
|
|
@@ -296,8 +296,9 @@ describe('BinaryTree', () => {
|
|
|
296
296
|
});
|
|
297
297
|
|
|
298
298
|
it('should isSubtreeBST', () => {
|
|
299
|
+
expect(tree.toVisual()).toBe('');
|
|
299
300
|
tree.addMany([4, 2, 6, 1, 3, 5, 7, 4]);
|
|
300
|
-
expect(tree.
|
|
301
|
+
expect(tree.toVisual()).toBe(
|
|
301
302
|
' ___4___ \n' +
|
|
302
303
|
' / \\ \n' +
|
|
303
304
|
' _2_ _6_ \n' +
|
|
@@ -305,12 +306,26 @@ describe('BinaryTree', () => {
|
|
|
305
306
|
' 1 3 5 7 \n' +
|
|
306
307
|
' \n'
|
|
307
308
|
);
|
|
309
|
+
const visualized = tree.toVisual(undefined, { isShowUndefined: true, isShowNull: true, isShowRedBlackNIL: true });
|
|
310
|
+
expect(visualized).toBe(
|
|
311
|
+
'U for undefined\n' +
|
|
312
|
+
' N for null\n' +
|
|
313
|
+
' S for Sentinel Node(NIL)\n' +
|
|
314
|
+
' _______4_______ \n' +
|
|
315
|
+
' / \\ \n' +
|
|
316
|
+
' ___2___ ___6___ \n' +
|
|
317
|
+
' / \\ / \\ \n' +
|
|
318
|
+
' _1_ _3_ _5_ _7_ \n' +
|
|
319
|
+
' / \\ / \\ / \\ / \\ \n' +
|
|
320
|
+
' U U U U U U U U \n' +
|
|
321
|
+
' \n'
|
|
322
|
+
);
|
|
308
323
|
|
|
309
324
|
expect(tree.isBST(tree.getNode(4), 'RECURSIVE')).toBe(true);
|
|
310
325
|
expect(tree.isBST(tree.getNode(4), 'ITERATIVE')).toBe(true);
|
|
311
|
-
expect(tree.getNodes(2,
|
|
326
|
+
expect(tree.getNodes(2, false, null)).toEqual([]);
|
|
312
327
|
expect(tree.getNodes(undefined)).toEqual([]);
|
|
313
|
-
expect(tree.getNodes(tree.getNodeByKey(2),
|
|
328
|
+
expect(tree.getNodes(tree.getNodeByKey(2), false, tree.root)).toEqual([tree.getNodeByKey(2)]);
|
|
314
329
|
});
|
|
315
330
|
|
|
316
331
|
describe('should isKey', () => {
|
|
@@ -472,13 +487,20 @@ describe('BinaryTree', () => {
|
|
|
472
487
|
});
|
|
473
488
|
|
|
474
489
|
it('should isLeaf', () => {
|
|
490
|
+
expect(tree.getLeftMost()).toBe(undefined);
|
|
491
|
+
expect(tree.getRightMost()).toBe(undefined);
|
|
475
492
|
tree.addMany([4, 2, 6, 1, 3, 5, 7, 4]);
|
|
476
493
|
const leftMost = tree.getLeftMost();
|
|
477
494
|
expect(tree.isLeaf(leftMost)).toBe(true);
|
|
478
495
|
expect(tree.isLeaf(null)).toBe(true);
|
|
496
|
+
const rightMost = tree.getRightMost();
|
|
497
|
+
expect(tree.isLeaf(rightMost)).toBe(true);
|
|
498
|
+
expect(tree.isLeaf(null)).toBe(true);
|
|
479
499
|
});
|
|
480
500
|
|
|
481
501
|
it('should tree traverse', () => {
|
|
502
|
+
expect(tree.dfs()).toEqual([]);
|
|
503
|
+
expect([...tree.values()]).toEqual([]);
|
|
482
504
|
tree.addMany([4, 2, 6, null, 1, 3, null, 5, null, 7]);
|
|
483
505
|
expect(tree.dfs(node => node.key, 'PRE', undefined, 'ITERATIVE')).toEqual([4, 2, 1, 5, 6, 3, 7]);
|
|
484
506
|
expect(tree.dfs(node => (node !== null ? node.key : null), 'PRE', undefined, 'ITERATIVE', false)).toEqual([
|
|
@@ -666,6 +688,7 @@ describe('BinaryTree', () => {
|
|
|
666
688
|
|
|
667
689
|
it('should duplicated nodes just replace the node exists', function () {
|
|
668
690
|
tree.clear();
|
|
691
|
+
expect(tree.bfs()).toEqual([]);
|
|
669
692
|
tree.addMany([-10, -10, -10, 9, 9, 20, null, null, 15, 7, 8, null, 2, null, 6, null, null, 8, 8, 8]);
|
|
670
693
|
|
|
671
694
|
expect(tree.bfs(node => (node ? node.key : null), undefined, undefined, true)).toEqual([
|
|
@@ -848,110 +871,102 @@ describe('BinaryTree toEntryFn', () => {
|
|
|
848
871
|
});
|
|
849
872
|
|
|
850
873
|
describe('BinaryTree traversals', () => {
|
|
851
|
-
|
|
874
|
+
it('traversals', () => {
|
|
875
|
+
const tree = new BinaryTree<number>();
|
|
876
|
+
|
|
877
|
+
const arr = [35, 20, 40, 15, 29, null, 50, null, 16, 28, 30, 45, 55];
|
|
878
|
+
tree.refill(arr);
|
|
879
|
+
expect(tree.bfs(node => node, tree.root, 'ITERATIVE', true).map(node => (node ? node.key : null))).toEqual([
|
|
880
|
+
35,
|
|
881
|
+
20,
|
|
882
|
+
40,
|
|
883
|
+
15,
|
|
884
|
+
29,
|
|
885
|
+
null,
|
|
886
|
+
50,
|
|
887
|
+
null,
|
|
888
|
+
16,
|
|
889
|
+
28,
|
|
890
|
+
30,
|
|
891
|
+
45,
|
|
892
|
+
55
|
|
893
|
+
]);
|
|
894
|
+
expect(tree.bfs(node => node, tree.root, 'RECURSIVE', true).map(node => (node ? node.key : null))).toEqual([
|
|
895
|
+
35,
|
|
896
|
+
20,
|
|
897
|
+
40,
|
|
898
|
+
15,
|
|
899
|
+
29,
|
|
900
|
+
null,
|
|
901
|
+
50,
|
|
902
|
+
null,
|
|
903
|
+
16,
|
|
904
|
+
28,
|
|
905
|
+
30,
|
|
906
|
+
45,
|
|
907
|
+
55
|
|
908
|
+
]);
|
|
909
|
+
expect(tree.bfs(node => node, tree.root, 'ITERATIVE').map(node => (node === null ? null : node.key))).toEqual([
|
|
910
|
+
35, 20, 40, 15, 29, 50, 16, 28, 30, 45, 55
|
|
911
|
+
]);
|
|
912
|
+
expect(tree.bfs(node => node, tree.root, 'RECURSIVE').map(node => (node === null ? null : node.key))).toEqual([
|
|
913
|
+
35, 20, 40, 15, 29, 50, 16, 28, 30, 45, 55
|
|
914
|
+
]);
|
|
915
|
+
|
|
916
|
+
expect(tree.dfs(node => node.key, 'PRE')).toEqual([35, 20, 15, 16, 29, 28, 30, 40, 50, 45, 55]);
|
|
917
|
+
expect(tree.dfs(node => node.key, 'PRE', tree.root, 'RECURSIVE')).toEqual([
|
|
918
|
+
35, 20, 15, 16, 29, 28, 30, 40, 50, 45, 55
|
|
919
|
+
]);
|
|
920
|
+
expect(
|
|
921
|
+
tree.dfs(node => node, 'PRE', tree.root, 'ITERATIVE', true).map(node => (node === null ? null : node.key))
|
|
922
|
+
).toEqual([35, 20, 15, null, 16, 29, 28, 30, 40, null, 50, 45, 55]);
|
|
923
|
+
expect(tree.dfs(node => node, 'PRE', tree.root, 'RECURSIVE', true).map(node => (node ? node.key : null))).toEqual([
|
|
924
|
+
35,
|
|
925
|
+
20,
|
|
926
|
+
15,
|
|
927
|
+
null,
|
|
928
|
+
16,
|
|
929
|
+
29,
|
|
930
|
+
28,
|
|
931
|
+
30,
|
|
932
|
+
40,
|
|
933
|
+
null,
|
|
934
|
+
50,
|
|
935
|
+
45,
|
|
936
|
+
55
|
|
937
|
+
]);
|
|
938
|
+
|
|
939
|
+
expect(tree.dfs(node => node.key, 'IN')).toEqual([15, 16, 20, 28, 29, 30, 35, 40, 45, 50, 55]);
|
|
940
|
+
expect(tree.dfs(node => node.key, 'POST')).toEqual([16, 15, 28, 30, 29, 20, 45, 55, 50, 40, 35]);
|
|
941
|
+
expect(tree.dfs(node => node.key, 'POST', tree.root, 'RECURSIVE')).toEqual([
|
|
942
|
+
16, 15, 28, 30, 29, 20, 45, 55, 50, 40, 35
|
|
943
|
+
]);
|
|
944
|
+
expect(tree.bfs(node => node.key, tree.root, 'RECURSIVE')).toEqual([35, 20, 40, 15, 29, 50, 16, 28, 30, 45, 55]);
|
|
945
|
+
expect(tree.bfs(node => node.key, tree.root, 'ITERATIVE')).toEqual([35, 20, 40, 15, 29, 50, 16, 28, 30, 45, 55]);
|
|
946
|
+
|
|
947
|
+
expect(tree.listLevels(node => node.key)).toEqual([[35], [20, 40], [15, 29, 50], [16, 28, 30, 45, 55]]);
|
|
852
948
|
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
15,
|
|
875
|
-
29,
|
|
876
|
-
null,
|
|
877
|
-
50,
|
|
878
|
-
null,
|
|
879
|
-
16,
|
|
880
|
-
28,
|
|
881
|
-
30,
|
|
882
|
-
45,
|
|
883
|
-
55
|
|
884
|
-
]);
|
|
885
|
-
expect(tree.bfs(node => node, tree.root, 'ITERATIVE').map(node => (node === null ? null : node.key))).toEqual([
|
|
886
|
-
35, 20, 40, 15, 29, 50, 16, 28, 30, 45, 55
|
|
887
|
-
]);
|
|
888
|
-
expect(tree.bfs(node => node, tree.root, 'RECURSIVE').map(node => (node === null ? null : node.key))).toEqual([
|
|
889
|
-
35, 20, 40, 15, 29, 50, 16, 28, 30, 45, 55
|
|
890
|
-
]);
|
|
891
|
-
|
|
892
|
-
expect(tree.dfs(node => node.key, 'PRE')).toEqual([35, 20, 15, 16, 29, 28, 30, 40, 50, 45, 55]);
|
|
893
|
-
expect(tree.dfs(node => node.key, 'PRE', tree.root, 'RECURSIVE')).toEqual([
|
|
894
|
-
35, 20, 15, 16, 29, 28, 30, 40, 50, 45, 55
|
|
895
|
-
]);
|
|
896
|
-
expect(tree.dfs(node => node, 'PRE', tree.root, 'ITERATIVE', true).map(node => (node ? node.key : null))).toEqual([
|
|
897
|
-
35,
|
|
898
|
-
20,
|
|
899
|
-
15,
|
|
900
|
-
null,
|
|
901
|
-
16,
|
|
902
|
-
29,
|
|
903
|
-
28,
|
|
904
|
-
30,
|
|
905
|
-
40,
|
|
906
|
-
null,
|
|
907
|
-
50,
|
|
908
|
-
45,
|
|
909
|
-
55
|
|
910
|
-
]);
|
|
911
|
-
expect(tree.dfs(node => node, 'PRE', tree.root, 'RECURSIVE', true).map(node => (node ? node.key : null))).toEqual([
|
|
912
|
-
35,
|
|
913
|
-
20,
|
|
914
|
-
15,
|
|
915
|
-
null,
|
|
916
|
-
16,
|
|
917
|
-
29,
|
|
918
|
-
28,
|
|
919
|
-
30,
|
|
920
|
-
40,
|
|
921
|
-
null,
|
|
922
|
-
50,
|
|
923
|
-
45,
|
|
924
|
-
55
|
|
925
|
-
]);
|
|
926
|
-
|
|
927
|
-
expect(tree.dfs(node => node.key, 'IN')).toEqual([15, 16, 20, 28, 29, 30, 35, 40, 45, 50, 55]);
|
|
928
|
-
expect(tree.dfs(node => node.key, 'POST')).toEqual([16, 15, 28, 30, 29, 20, 45, 55, 50, 40, 35]);
|
|
929
|
-
expect(tree.dfs(node => node.key, 'POST', tree.root, 'RECURSIVE')).toEqual([
|
|
930
|
-
16, 15, 28, 30, 29, 20, 45, 55, 50, 40, 35
|
|
931
|
-
]);
|
|
932
|
-
expect(tree.bfs(node => node.key, tree.root, 'RECURSIVE')).toEqual([35, 20, 40, 15, 29, 50, 16, 28, 30, 45, 55]);
|
|
933
|
-
expect(tree.bfs(node => node.key, tree.root, 'ITERATIVE')).toEqual([35, 20, 40, 15, 29, 50, 16, 28, 30, 45, 55]);
|
|
934
|
-
|
|
935
|
-
expect(tree.listLevels(node => node.key)).toEqual([[35], [20, 40], [15, 29, 50], [16, 28, 30, 45, 55]]);
|
|
936
|
-
|
|
937
|
-
expect(tree.listLevels(node => node.key, tree.root, 'RECURSIVE')).toEqual([
|
|
938
|
-
[35],
|
|
939
|
-
[20, 40],
|
|
940
|
-
[15, 29, 50],
|
|
941
|
-
[16, 28, 30, 45, 55]
|
|
942
|
-
]);
|
|
943
|
-
expect(tree.listLevels(node => (node ? node.key : null), tree.root, 'ITERATIVE', true)).toEqual([
|
|
944
|
-
[35],
|
|
945
|
-
[20, 40],
|
|
946
|
-
[15, 29, null, 50],
|
|
947
|
-
[null, 16, 28, 30, 45, 55]
|
|
948
|
-
]);
|
|
949
|
-
expect(tree.listLevels(node => (node ? node.key : null), tree.root, 'RECURSIVE', true)).toEqual([
|
|
950
|
-
[35],
|
|
951
|
-
[20, 40],
|
|
952
|
-
[15, 29, null, 50],
|
|
953
|
-
[null, 16, 28, 30, 45, 55]
|
|
954
|
-
]);
|
|
949
|
+
expect(tree.listLevels(node => node.key, tree.root, 'RECURSIVE')).toEqual([
|
|
950
|
+
[35],
|
|
951
|
+
[20, 40],
|
|
952
|
+
[15, 29, 50],
|
|
953
|
+
[16, 28, 30, 45, 55]
|
|
954
|
+
]);
|
|
955
|
+
expect(tree.listLevels(node => (node ? node.key : null), tree.root, 'ITERATIVE', true)).toEqual([
|
|
956
|
+
[35],
|
|
957
|
+
[20, 40],
|
|
958
|
+
[15, 29, null, 50],
|
|
959
|
+
[null, 16, 28, 30, 45, 55]
|
|
960
|
+
]);
|
|
961
|
+
expect(tree.listLevels(node => (node ? node.key : null), tree.root, 'RECURSIVE', true)).toEqual([
|
|
962
|
+
[35],
|
|
963
|
+
[20, 40],
|
|
964
|
+
[15, 29, null, 50],
|
|
965
|
+
[null, 16, 28, 30, 45, 55]
|
|
966
|
+
]);
|
|
967
|
+
tree.clear();
|
|
968
|
+
expect(tree.listLevels()).toEqual([]);
|
|
969
|
+
});
|
|
955
970
|
});
|
|
956
971
|
|
|
957
972
|
describe('BinaryTree', () => {
|
|
@@ -1027,6 +1042,7 @@ describe('BinaryTree', () => {
|
|
|
1027
1042
|
});
|
|
1028
1043
|
|
|
1029
1044
|
it('should get the height of the tree', () => {
|
|
1045
|
+
expect(tree.getMinHeight()).toBe(-1);
|
|
1030
1046
|
tree.add([5, 'A']);
|
|
1031
1047
|
tree.add(3, 'B');
|
|
1032
1048
|
tree.add([7, 'C']);
|
|
@@ -1085,6 +1101,15 @@ describe('BinaryTree', () => {
|
|
|
1085
1101
|
expect(tree.getNode(3)).toBe(null);
|
|
1086
1102
|
});
|
|
1087
1103
|
|
|
1104
|
+
it('should getPathToRoot', () => {
|
|
1105
|
+
tree.add([5, 'A']);
|
|
1106
|
+
tree.add([3, 'B']);
|
|
1107
|
+
tree.add([7, 'C']);
|
|
1108
|
+
|
|
1109
|
+
expect(tree.getPathToRoot(undefined, 7)).toEqual([5, 7]);
|
|
1110
|
+
expect(tree.getPathToRoot(undefined, 1)).toEqual([]);
|
|
1111
|
+
});
|
|
1112
|
+
|
|
1088
1113
|
it('should check if the tree is perfectly balanced', () => {
|
|
1089
1114
|
tree.add([5, 'A']);
|
|
1090
1115
|
tree.add([3, 'B']);
|
|
@@ -1105,17 +1130,17 @@ describe('BinaryTree', () => {
|
|
|
1105
1130
|
tree.add([2, 'B']);
|
|
1106
1131
|
tree.add([null, 'null']);
|
|
1107
1132
|
|
|
1108
|
-
const nodes = tree.getNodes(
|
|
1133
|
+
const nodes = tree.getNodes(node => node.value === 'B');
|
|
1109
1134
|
|
|
1110
1135
|
expect(nodes.length).toBe(1);
|
|
1111
1136
|
expect(nodes[0].key).toBe(2);
|
|
1112
1137
|
|
|
1113
|
-
const nodesRec = tree.getNodes(
|
|
1138
|
+
const nodesRec = tree.getNodes(node => node.value === 'B', false, tree.root, 'RECURSIVE');
|
|
1114
1139
|
|
|
1115
1140
|
expect(nodesRec.length).toBe(1);
|
|
1116
1141
|
expect(nodesRec[0].key).toBe(2);
|
|
1117
1142
|
|
|
1118
|
-
const nodesItr = tree.getNodes(
|
|
1143
|
+
const nodesItr = tree.getNodes(node => node.value === 'B', false, tree.root, 'ITERATIVE');
|
|
1119
1144
|
|
|
1120
1145
|
expect(nodesItr.length).toBe(1);
|
|
1121
1146
|
expect(nodesItr[0].key).toBe(2);
|
|
@@ -1144,7 +1169,8 @@ describe('BinaryTree', () => {
|
|
|
1144
1169
|
|
|
1145
1170
|
const result = tree.morris();
|
|
1146
1171
|
expect(result).toEqual([3, 5, 7]);
|
|
1147
|
-
|
|
1172
|
+
tree.clear();
|
|
1173
|
+
expect(tree.morris()).toEqual([]);
|
|
1148
1174
|
});
|
|
1149
1175
|
|
|
1150
1176
|
it('should perform delete all', () => {
|
|
@@ -1243,6 +1269,8 @@ describe('BinaryTree iterative methods test', () => {
|
|
|
1243
1269
|
it('should leaves', () => {
|
|
1244
1270
|
const leaves = binaryTree.leaves();
|
|
1245
1271
|
expect(leaves).toEqual([2, 3]);
|
|
1272
|
+
binaryTree.clear();
|
|
1273
|
+
expect(binaryTree.leaves()).toEqual([]);
|
|
1246
1274
|
});
|
|
1247
1275
|
|
|
1248
1276
|
it('should iterative method return undefined when the node is null', () => {
|