Skip to content

Commit f1a4c8c

Browse files
committed
Add traversePostOrderNAry TypeScript goody
Tested on LeetCode: https://leetcode.com/problems/n-ary-tree-postorder-traversal/submissions/1368487878/
1 parent 96d3794 commit f1a4c8c

File tree

7 files changed

+290
-100
lines changed

7 files changed

+290
-100
lines changed

workspaces/adventure-pack/goodies/typescript/traverseInOrder/index.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,18 @@ export function* traverseInOrder<
22
T extends { left?: T | null | undefined; right?: T | null | undefined },
33
>(root: T | null | undefined): Generator<T, void, void> {
44
const stack: [T | null | undefined, boolean][] = [[root, false]];
5-
while (stack.length > 0) {
5+
6+
do {
67
const [node, didTraverseLeftChild] = stack.pop()!;
7-
if (node) {
8-
if (didTraverseLeftChild) {
9-
yield node;
10-
} else {
11-
stack.push([node.right, false], [node, true], [node.left, false]);
12-
}
8+
if (node == null) {
9+
continue;
1310
}
14-
}
11+
12+
if (didTraverseLeftChild) {
13+
yield node;
14+
continue;
15+
}
16+
17+
stack.push([node.right, false], [node, true], [node.left, false]);
18+
} while (stack.length > 0);
1519
}

workspaces/adventure-pack/goodies/typescript/traverseLevelOrder/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@ import { isNonNullish } from "../isNonNullish";
33
export function* traverseLevelOrder<
44
T extends { left?: T | null | undefined; right?: T | null | undefined },
55
>(root: T | null | undefined): Generator<T[], void, void> {
6-
if (!root) {
6+
if (root == null) {
77
return;
88
}
99

1010
let level = [root];
1111
do {
1212
yield level;
13+
1314
level = level
1415
.flatMap((node) => [node.left, node.right])
1516
.filter(isNonNullish);

workspaces/adventure-pack/goodies/typescript/traversePostOrder/index.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,18 @@ export function* traversePostOrder<
22
T extends { left?: T | null | undefined; right?: T | null | undefined },
33
>(root: T | null | undefined): Generator<T, void, void> {
44
const stack: [T | null | undefined, boolean][] = [[root, false]];
5-
while (stack.length > 0) {
5+
6+
do {
67
const [node, didTraverseChildren] = stack.pop()!;
7-
if (node) {
8-
if (didTraverseChildren) {
9-
yield node;
10-
} else {
11-
stack.push([node, true], [node.right, false], [node.left, false]);
12-
}
8+
if (node == null) {
9+
continue;
1310
}
14-
}
11+
12+
if (didTraverseChildren) {
13+
yield node;
14+
continue;
15+
}
16+
17+
stack.push([node, true], [node.right, false], [node.left, false]);
18+
} while (stack.length > 0);
1519
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
export function* traversePostOrderNAry<T extends { children: T[] }>(
2+
root: T | null | undefined,
3+
): Generator<T, void, void> {
4+
const stack: [T | null | undefined, boolean][] = [[root, false]];
5+
6+
do {
7+
const [node, didTraverseChildren] = stack.pop()!;
8+
if (node == null) {
9+
continue;
10+
}
11+
12+
if (didTraverseChildren) {
13+
yield node;
14+
continue;
15+
}
16+
17+
stack.push([node, true]);
18+
// TODO: add an Array.prototype.valuesReversed() goody and use it here
19+
for (let i = node.children.length - 1; i >= 0; --i) {
20+
stack.push([node.children[i], false]);
21+
}
22+
} while (stack.length > 0);
23+
}

workspaces/adventure-pack/goodies/typescript/traversePreOrder/index.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ export function* traversePreOrder<
22
T extends { left?: T | null | undefined; right?: T | null | undefined },
33
>(root: T | null | undefined): Generator<T, void, void> {
44
const stack = [root];
5-
while (stack.length > 0) {
5+
6+
do {
67
const node = stack.pop();
7-
if (node) {
8+
9+
if (node != null) {
810
yield node;
911
stack.push(node.right, node.left);
1012
}
11-
}
13+
} while (stack.length > 0);
1214
}

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

Lines changed: 124 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2482,16 +2482,20 @@ exports[`App can equip single goody: JavaScript traverseInOrder 1`] = `
24822482

24832483
function* traverseInOrder(root) {
24842484
const stack = [[root, false]];
2485-
while (stack.length > 0) {
2485+
2486+
do {
24862487
const [node, didTraverseLeftChild] = stack.pop();
2487-
if (node) {
2488-
if (didTraverseLeftChild) {
2489-
yield node;
2490-
} else {
2491-
stack.push([node.right, false], [node, true], [node.left, false]);
2492-
}
2488+
if (node == null) {
2489+
continue;
24932490
}
2494-
}
2491+
2492+
if (didTraverseLeftChild) {
2493+
yield node;
2494+
continue;
2495+
}
2496+
2497+
stack.push([node.right, false], [node, true], [node.left, false]);
2498+
} while (stack.length > 0);
24952499
}
24962500

24972501
/////////////////////////// END ADVENTURE PACK CODE ////////////////////////////"
@@ -2507,13 +2511,14 @@ function isNonNullish(value) {
25072511
}
25082512

25092513
function* traverseLevelOrder(root) {
2510-
if (!root) {
2514+
if (root == null) {
25112515
return;
25122516
}
25132517

25142518
let level = [root];
25152519
do {
25162520
yield level;
2521+
25172522
level = level
25182523
.flatMap((node) => [node.left, node.right])
25192524
.filter(isNonNullish);
@@ -2530,16 +2535,50 @@ exports[`App can equip single goody: JavaScript traversePostOrder 1`] = `
25302535

25312536
function* traversePostOrder(root) {
25322537
const stack = [[root, false]];
2533-
while (stack.length > 0) {
2538+
2539+
do {
25342540
const [node, didTraverseChildren] = stack.pop();
2535-
if (node) {
2536-
if (didTraverseChildren) {
2537-
yield node;
2538-
} else {
2539-
stack.push([node, true], [node.right, false], [node.left, false]);
2540-
}
2541+
if (node == null) {
2542+
continue;
25412543
}
2542-
}
2544+
2545+
if (didTraverseChildren) {
2546+
yield node;
2547+
continue;
2548+
}
2549+
2550+
stack.push([node, true], [node.right, false], [node.left, false]);
2551+
} while (stack.length > 0);
2552+
}
2553+
2554+
/////////////////////////// END ADVENTURE PACK CODE ////////////////////////////"
2555+
`;
2556+
2557+
exports[`App can equip single goody: JavaScript traversePostOrderNAry 1`] = `
2558+
"////////////////////////// BEGIN ADVENTURE PACK CODE ///////////////////////////
2559+
// Adventure Pack commit fake-commit-hash
2560+
// Running at: https://example.com/
2561+
2562+
function* traversePostOrderNAry(root) {
2563+
const stack = [[root, false]];
2564+
2565+
do {
2566+
const [node, didTraverseChildren] = stack.pop();
2567+
if (node == null) {
2568+
continue;
2569+
}
2570+
2571+
if (didTraverseChildren) {
2572+
yield node;
2573+
continue;
2574+
}
2575+
2576+
stack.push([node, true]);
2577+
// TODO: add an Array.prototype.valuesReversed() goody and use it here
2578+
for (let i = node.children.length - 1; i >= 0; --i) {
2579+
stack.push([node.children[i], false]);
2580+
}
2581+
} while (stack.length > 0);
25432582
}
25442583

25452584
/////////////////////////// END ADVENTURE PACK CODE ////////////////////////////"
@@ -2552,13 +2591,15 @@ exports[`App can equip single goody: JavaScript traversePreOrder 1`] = `
25522591

25532592
function* traversePreOrder(root) {
25542593
const stack = [root];
2555-
while (stack.length > 0) {
2594+
2595+
do {
25562596
const node = stack.pop();
2557-
if (node) {
2597+
2598+
if (node != null) {
25582599
yield node;
25592600
stack.push(node.right, node.left);
25602601
}
2561-
}
2602+
} while (stack.length > 0);
25622603
}
25632604

25642605
/////////////////////////// END ADVENTURE PACK CODE ////////////////////////////"
@@ -4967,16 +5008,20 @@ function* traverseInOrder<
49675008
T extends { left?: T | null | undefined; right?: T | null | undefined },
49685009
>(root: T | null | undefined): Generator<T, void, void> {
49695010
const stack: [T | null | undefined, boolean][] = [[root, false]];
4970-
while (stack.length > 0) {
5011+
5012+
do {
49715013
const [node, didTraverseLeftChild] = stack.pop()!;
4972-
if (node) {
4973-
if (didTraverseLeftChild) {
4974-
yield node;
4975-
} else {
4976-
stack.push([node.right, false], [node, true], [node.left, false]);
4977-
}
5014+
if (node == null) {
5015+
continue;
49785016
}
4979-
}
5017+
5018+
if (didTraverseLeftChild) {
5019+
yield node;
5020+
continue;
5021+
}
5022+
5023+
stack.push([node.right, false], [node, true], [node.left, false]);
5024+
} while (stack.length > 0);
49805025
}
49815026

49825027
/////////////////////////// END ADVENTURE PACK CODE ////////////////////////////"
@@ -4994,13 +5039,14 @@ function isNonNullish<T>(value: T | null | undefined): value is T {
49945039
function* traverseLevelOrder<
49955040
T extends { left?: T | null | undefined; right?: T | null | undefined },
49965041
>(root: T | null | undefined): Generator<T[], void, void> {
4997-
if (!root) {
5042+
if (root == null) {
49985043
return;
49995044
}
50005045

50015046
let level = [root];
50025047
do {
50035048
yield level;
5049+
50045050
level = level
50055051
.flatMap((node) => [node.left, node.right])
50065052
.filter(isNonNullish);
@@ -5019,16 +5065,52 @@ function* traversePostOrder<
50195065
T extends { left?: T | null | undefined; right?: T | null | undefined },
50205066
>(root: T | null | undefined): Generator<T, void, void> {
50215067
const stack: [T | null | undefined, boolean][] = [[root, false]];
5022-
while (stack.length > 0) {
5068+
5069+
do {
50235070
const [node, didTraverseChildren] = stack.pop()!;
5024-
if (node) {
5025-
if (didTraverseChildren) {
5026-
yield node;
5027-
} else {
5028-
stack.push([node, true], [node.right, false], [node.left, false]);
5029-
}
5071+
if (node == null) {
5072+
continue;
50305073
}
5031-
}
5074+
5075+
if (didTraverseChildren) {
5076+
yield node;
5077+
continue;
5078+
}
5079+
5080+
stack.push([node, true], [node.right, false], [node.left, false]);
5081+
} while (stack.length > 0);
5082+
}
5083+
5084+
/////////////////////////// END ADVENTURE PACK CODE ////////////////////////////"
5085+
`;
5086+
5087+
exports[`App can equip single goody: TypeScript traversePostOrderNAry 1`] = `
5088+
"////////////////////////// BEGIN ADVENTURE PACK CODE ///////////////////////////
5089+
// Adventure Pack commit fake-commit-hash
5090+
// Running at: https://example.com/
5091+
5092+
function* traversePostOrderNAry<T extends { children: T[] }>(
5093+
root: T | null | undefined,
5094+
): Generator<T, void, void> {
5095+
const stack: [T | null | undefined, boolean][] = [[root, false]];
5096+
5097+
do {
5098+
const [node, didTraverseChildren] = stack.pop()!;
5099+
if (node == null) {
5100+
continue;
5101+
}
5102+
5103+
if (didTraverseChildren) {
5104+
yield node;
5105+
continue;
5106+
}
5107+
5108+
stack.push([node, true]);
5109+
// TODO: add an Array.prototype.valuesReversed() goody and use it here
5110+
for (let i = node.children.length - 1; i >= 0; --i) {
5111+
stack.push([node.children[i], false]);
5112+
}
5113+
} while (stack.length > 0);
50325114
}
50335115

50345116
/////////////////////////// END ADVENTURE PACK CODE ////////////////////////////"
@@ -5043,13 +5125,15 @@ function* traversePreOrder<
50435125
T extends { left?: T | null | undefined; right?: T | null | undefined },
50445126
>(root: T | null | undefined): Generator<T, void, void> {
50455127
const stack = [root];
5046-
while (stack.length > 0) {
5128+
5129+
do {
50475130
const node = stack.pop();
5048-
if (node) {
5131+
5132+
if (node != null) {
50495133
yield node;
50505134
stack.push(node.right, node.left);
50515135
}
5052-
}
5136+
} while (stack.length > 0);
50535137
}
50545138

50555139
/////////////////////////// END ADVENTURE PACK CODE ////////////////////////////"

0 commit comments

Comments
 (0)