Skip to content

Commit 3bb2039

Browse files
committed
Add Java traverseInorder goody
Similar to the TypeScript one! Tested on LeetCode: https://leetcode.com/problems/binary-tree-inorder-traversal/submissions/1320541134/
1 parent f839b64 commit 3bb2039

File tree

5 files changed

+226
-1
lines changed

5 files changed

+226
-1
lines changed

tools/adventure-pack/goodies/java/src/to_iterable/AP.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
package to_iterable;
2+
13
import java.util.Iterator;
24

3-
final class AP {
5+
public final class AP {
46

57
public static <T> Iterable<T> toIterable(final Iterator<T> iterator) {
68
return () -> iterator;
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package traverse_inorder;
2+
3+
import static to_iterable.AP.*;
4+
5+
import java.util.Iterator;
6+
import java.util.NoSuchElementException;
7+
import java.util.Stack;
8+
import pair.Pair;
9+
import simple_iterator.SimpleIterator;
10+
11+
public final class AP {
12+
13+
public static Iterable<TreeNode> traverseInorder(final TreeNode root) {
14+
final var stack = new Stack<Pair<TreeNode, Boolean>>();
15+
stack.push(new Pair<>(root, false));
16+
17+
return toIterable(
18+
SimpleIterator.toIterator(() -> {
19+
while (!stack.isEmpty()) {
20+
var nodeAndDidTraverseLeftChild = stack.pop();
21+
22+
var node = nodeAndDidTraverseLeftChild.first();
23+
if (node == null) {
24+
continue;
25+
}
26+
27+
if (nodeAndDidTraverseLeftChild.second()) {
28+
return node;
29+
}
30+
31+
stack.push(new Pair<>(node.right, false));
32+
stack.push(new Pair<>(node, true));
33+
stack.push(new Pair<>(node.left, false));
34+
}
35+
36+
throw new NoSuchElementException();
37+
})
38+
);
39+
}
40+
}
41+
42+
class TreeNode {
43+
44+
// TODO: support comments outside a class in code extraction
45+
46+
// TODO: don't include this class in the goody, since it's automatically defined by LeetCode
47+
48+
// TODO: get coreImports to be first in generated output
49+
50+
// TODO: alphabetize classes when merging Java code
51+
52+
TreeNode left, right;
53+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"name": "traverseInorder"
3+
}

tools/adventure-pack/src/app/__tests__/__snapshots__/equip-test.ts.snap

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,116 @@ final class AP {
185185
/////////////////////////// END ADVENTURE PACK CODE ////////////////////////////"
186186
`;
187187
188+
exports[`App can equip single goody: Java traverseInorder 1`] = `
189+
"////////////////////////// BEGIN ADVENTURE PACK CODE ///////////////////////////
190+
// Adventure Pack commit fake-commit-hash
191+
// Running at: https://example.com/
192+
193+
import java.util.Iterator;
194+
import java.util.NoSuchElementException;
195+
import java.util.Stack;
196+
197+
record Pair<TFirst, TSecond>(TFirst first, TSecond second) {}
198+
199+
interface SimpleIterator<T> {
200+
public T next();
201+
202+
static enum HasNextState {
203+
TRUE,
204+
FALSE,
205+
UNKNOWN,
206+
}
207+
208+
public static <T> Iterator<T> toIterator(final SimpleIterator<T> iterator) {
209+
final HasNextState[] hasNextState = { HasNextState.UNKNOWN };
210+
final Object[] elementReserve = { null };
211+
212+
return new Iterator<T>() {
213+
public boolean hasNext() {
214+
if (hasNextState[0] == HasNextState.UNKNOWN) {
215+
try {
216+
elementReserve[0] = iterator.next();
217+
hasNextState[0] = HasNextState.TRUE;
218+
} catch (NoSuchElementException e) {
219+
hasNextState[0] = HasNextState.FALSE;
220+
}
221+
}
222+
223+
return hasNextState[0] == HasNextState.TRUE;
224+
}
225+
226+
public T next() {
227+
if (hasNextState[0] == HasNextState.TRUE) {
228+
hasNextState[0] = HasNextState.UNKNOWN;
229+
230+
@SuppressWarnings("unchecked")
231+
T element = (T) elementReserve[0];
232+
233+
elementReserve[0] = null;
234+
return element;
235+
}
236+
237+
if (hasNextState[0] == HasNextState.UNKNOWN) {
238+
return iterator.next();
239+
}
240+
241+
throw new NoSuchElementException();
242+
}
243+
};
244+
}
245+
}
246+
247+
final class AP {
248+
private AP() {}
249+
250+
public static <T> Iterable<T> toIterable(final Iterator<T> iterator) {
251+
return () -> iterator;
252+
}
253+
254+
public static Iterable<TreeNode> traverseInorder(final TreeNode root) {
255+
final var stack = new Stack<Pair<TreeNode, Boolean>>();
256+
stack.push(new Pair<>(root, false));
257+
258+
return toIterable(
259+
SimpleIterator.toIterator(() -> {
260+
while (!stack.isEmpty()) {
261+
var nodeAndDidTraverseLeftChild = stack.pop();
262+
263+
var node = nodeAndDidTraverseLeftChild.first();
264+
if (node == null) {
265+
continue;
266+
}
267+
268+
if (nodeAndDidTraverseLeftChild.second()) {
269+
return node;
270+
}
271+
272+
stack.push(new Pair<>(node.right, false));
273+
stack.push(new Pair<>(node, true));
274+
stack.push(new Pair<>(node.left, false));
275+
}
276+
277+
throw new NoSuchElementException();
278+
})
279+
);
280+
}
281+
}
282+
283+
class TreeNode {
284+
// TODO: support comments outside a class in code extraction
285+
286+
// TODO: don't include this class in the goody, since it's automatically defined by LeetCode
287+
288+
// TODO: get coreImports to be first in generated output
289+
290+
// TODO: alphabetize classes when merging Java code
291+
292+
TreeNode left, right;
293+
}
294+
295+
/////////////////////////// END ADVENTURE PACK CODE ////////////////////////////"
296+
`;
297+
188298
exports[`App can equip single goody: JavaScript Array.prototype.slidingWindows 1`] = `
189299
"////////////////////////// BEGIN ADVENTURE PACK CODE ///////////////////////////
190300
// Adventure Pack commit fake-commit-hash

tools/adventure-pack/src/app/__tests__/__snapshots__/render-test.ts.snap

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,63 @@ final class AP {
147147
}"
148148
`;
149149
150+
exports[`App can render goody: Java traverseInorder 1`] = `
151+
"package traverse_inorder;
152+
153+
import static to_iterable.AP.*;
154+
155+
import pair.Pair;
156+
import simple_iterator.SimpleIterator;
157+
158+
import java.util.Iterator;
159+
import java.util.NoSuchElementException;
160+
import java.util.Stack;
161+
162+
final class AP {
163+
private AP() {}
164+
165+
public static Iterable<TreeNode> traverseInorder(final TreeNode root) {
166+
final var stack = new Stack<Pair<TreeNode, Boolean>>();
167+
stack.push(new Pair<>(root, false));
168+
169+
return toIterable(
170+
SimpleIterator.toIterator(() -> {
171+
while (!stack.isEmpty()) {
172+
var nodeAndDidTraverseLeftChild = stack.pop();
173+
174+
var node = nodeAndDidTraverseLeftChild.first();
175+
if (node == null) {
176+
continue;
177+
}
178+
179+
if (nodeAndDidTraverseLeftChild.second()) {
180+
return node;
181+
}
182+
183+
stack.push(new Pair<>(node.right, false));
184+
stack.push(new Pair<>(node, true));
185+
stack.push(new Pair<>(node.left, false));
186+
}
187+
188+
throw new NoSuchElementException();
189+
})
190+
);
191+
}
192+
}
193+
194+
class TreeNode {
195+
// TODO: support comments outside a class in code extraction
196+
197+
// TODO: don't include this class in the goody, since it's automatically defined by LeetCode
198+
199+
// TODO: get coreImports to be first in generated output
200+
201+
// TODO: alphabetize classes when merging Java code
202+
203+
TreeNode left, right;
204+
}"
205+
`;
206+
150207
exports[`App can render goody: JavaScript Array.prototype.slidingWindows 1`] = `
151208
"import "ArraySlice";
152209

0 commit comments

Comments
 (0)