-
Notifications
You must be signed in to change notification settings - Fork 0
/
2649. Nested Array Generator.js
66 lines (50 loc) · 1.5 KB
/
2649. Nested Array Generator.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/*
Given a multi-dimensional array of integers, return a generator object which yields integers in the same order as inorder traversal.
A multi-dimensional array is a recursive data structure that contains both integers and other multi-dimensional arrays.
inorder traversal iterates over each array from left to right, yielding any integers it encounters or applying inorder traversal to any arrays it encounters.
Example 1:
Input: arr = [[[6]],[1,3],[]]
Output: [6,1,3]
Explanation:
const generator = inorderTraversal(arr);
generator.next().value; // 6
generator.next().value; // 1
generator.next().value; // 3
generator.next().done; // true
Example 2:
Input: arr = []
Output: []
Explanation: There are no integers so the generator doesn't yield anything.
Constraints:
0 <= arr.flat().length <= 105
0 <= arr.flat()[i] <= 105
maxNestingDepth <= 105
Can you solve this without creating a new flattened version of the array?
*/
/**
* @param {Array} arr
* @return {Generator}
*/
var inorderTraversal = function*(arr) {
if (arr.length === 0) { return; }
for (let key in arr) {
if (Array.isArray(arr[key])) {
const innerGen = inorderTraversal(arr[key]);
let task;
do {
if (task) {
yield task.value;
}
task = innerGen.next();
} while (!task.done)
} else {
yield arr[key];
}
}
};
/**
* const gen = inorderTraversal([1, [2, 3]]);
* gen.next().value; // 1
* gen.next().value; // 2
* gen.next().value; // 3
*/