Skip to content

Commit e7173b6

Browse files
committed
Add goodie for pre-order of an n-ary tree
Closes #396.
1 parent 2cfd03b commit e7173b6

2 files changed

Lines changed: 68 additions & 0 deletions

File tree

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import { describe, expect, it } from "@jest/globals";
2+
3+
import { traversePreOrderNAry } from "./index.ts";
4+
5+
type Node = { val: number; children: Node[] };
6+
7+
describe("traversePreOrderNAry", () => {
8+
it("returns empty for null root", () => {
9+
expect([...traversePreOrderNAry(null)]).toStrictEqual([]);
10+
});
11+
12+
it("returns empty for undefined root", () => {
13+
expect([...traversePreOrderNAry(undefined)]).toStrictEqual([]);
14+
});
15+
16+
it("yields root only for single node", () => {
17+
const root: Node = { val: 1, children: [] };
18+
expect([...traversePreOrderNAry(root)].map((n) => n.val)).toStrictEqual([
19+
1,
20+
]);
21+
});
22+
23+
it("visits parent before children", () => {
24+
const root: Node = {
25+
val: 1,
26+
children: [{ val: 2, children: [] }, { val: 3, children: [] }],
27+
};
28+
expect([...traversePreOrderNAry(root)].map((n) => n.val)).toStrictEqual([
29+
1, 2, 3,
30+
]);
31+
});
32+
33+
it("traverses deeper trees in pre-order", () => {
34+
const root: Node = {
35+
val: 1,
36+
children: [
37+
{
38+
val: 2,
39+
children: [
40+
{ val: 4, children: [] },
41+
{ val: 5, children: [] },
42+
],
43+
},
44+
{ val: 3, children: [] },
45+
],
46+
};
47+
expect([...traversePreOrderNAry(root)].map((n) => n.val)).toStrictEqual([
48+
1, 2, 4, 5, 3,
49+
]);
50+
});
51+
});
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
export function* traversePreOrderNAry<T extends { children: T[] }>(
2+
root: T | null | undefined,
3+
): Generator<T, void, void> {
4+
if (root == null) {
5+
return;
6+
}
7+
8+
const stack: T[] = [root];
9+
10+
do {
11+
const node = stack.pop()!;
12+
yield node;
13+
for (let i = node.children.length - 1; i >= 0; --i) {
14+
stack.push(node.children[i]);
15+
}
16+
} while (stack.length > 0);
17+
}

0 commit comments

Comments
 (0)