Skip to content

Commit 6fab7e9

Browse files
authored
Add Python n-ary postorder traversal goody (#504)
Closes #394.
1 parent d97371c commit 6fab7e9

File tree

6 files changed

+162
-0
lines changed

6 files changed

+162
-0
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,5 @@ yarn-error.log
1010
!.yarn/releases
1111
!.yarn/sdks
1212
!.yarn/versions
13+
14+
.idea
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
from typing import Generator, Optional, List
2+
3+
4+
class TreeNode:
5+
def __init__(
6+
self,
7+
val: int = 0,
8+
children: List["TreeNode"] = [],
9+
):
10+
self.val = val
11+
self.children = children
12+
13+
14+
def traverse_postorder_n_ary(
15+
root: Optional[TreeNode],
16+
) -> Generator[TreeNode, None, None]:
17+
stack = [(root, False)]
18+
while stack:
19+
node, did_traverse_children = stack.pop()
20+
if not node:
21+
continue
22+
23+
if did_traverse_children:
24+
yield node
25+
continue
26+
27+
stack.append((node, True))
28+
for child in reversed(node.children):
29+
stack.append((child, False))
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"name": "traverse_postorder_n_ary"
3+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
from . import *
2+
3+
4+
def test_empty_tree() -> None:
5+
assert list(traverse_postorder_n_ary(None)) == []
6+
7+
8+
def test_root_only() -> None:
9+
root = TreeNode(10)
10+
assert [node.val for node in traverse_postorder_n_ary(root)] == [10]
11+
12+
13+
def test_three_children() -> None:
14+
root = TreeNode(10)
15+
root.children = [TreeNode(4), TreeNode(5), TreeNode(6)]
16+
assert [node.val for node in traverse_postorder_n_ary(root)] == [
17+
4,
18+
5,
19+
6,
20+
10,
21+
]
22+
23+
24+
def test_unbalanced_tree() -> None:
25+
root = TreeNode(1)
26+
root.children = [TreeNode(2)]
27+
root.children[0].children = [TreeNode(3)]
28+
root.children[0].children[0].children = [TreeNode(4)]
29+
30+
assert [node.val for node in traverse_postorder_n_ary(root)] == [4, 3, 2, 1]
31+
32+
33+
def test_large_tree() -> None:
34+
root = TreeNode(1)
35+
root.children = [TreeNode(2), TreeNode(3), TreeNode(4)]
36+
root.children[0].children = [TreeNode(5), TreeNode(6)]
37+
root.children[0].children[0].children = [TreeNode(8), TreeNode(9)]
38+
root.children[0].children[0].children[1].children = [
39+
TreeNode(11),
40+
TreeNode(12),
41+
]
42+
root.children[0].children[1].children = [TreeNode(10)]
43+
root.children[2].children = [TreeNode(7)]
44+
45+
assert [node.val for node in traverse_postorder_n_ary(root)] == [
46+
8,
47+
11,
48+
12,
49+
9,
50+
5,
51+
10,
52+
6,
53+
2,
54+
3,
55+
7,
56+
4,
57+
1,
58+
]

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

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3042,6 +3042,44 @@ def traverse_postorder(
30423042
########################### END ADVENTURE PACK CODE ############################"
30433043
`;
30443044

3045+
exports[`App can equip single goody: Python 3 traverse_postorder_n_ary 1`] = `
3046+
"########################## BEGIN ADVENTURE PACK CODE ###########################
3047+
# Adventure Pack commit fake-commit-hash
3048+
# Running at: https://example.com/
3049+
3050+
from typing import Generator, Optional, List
3051+
3052+
3053+
class TreeNode:
3054+
def __init__(
3055+
self,
3056+
val: int = 0,
3057+
children: List["TreeNode"] = [],
3058+
):
3059+
self.val = val
3060+
self.children = children
3061+
3062+
3063+
def traverse_postorder_n_ary(
3064+
root: Optional[TreeNode],
3065+
) -> Generator[TreeNode, None, None]:
3066+
stack = [(root, False)]
3067+
while stack:
3068+
node, did_traverse_children = stack.pop()
3069+
if not node:
3070+
continue
3071+
3072+
if did_traverse_children:
3073+
yield node
3074+
continue
3075+
3076+
stack.append((node, True))
3077+
for child in reversed(node.children):
3078+
stack.append((child, False))
3079+
3080+
########################### END ADVENTURE PACK CODE ############################"
3081+
`;
3082+
30453083
exports[`App can equip single goody: Python 3 traverse_preorder 1`] = `
30463084
"########################## BEGIN ADVENTURE PACK CODE ###########################
30473085
# Adventure Pack commit fake-commit-hash

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1748,6 +1748,38 @@ def traverse_postorder(
17481748
stack.append((node.left, False))"
17491749
`;
17501750
1751+
exports[`App can render goody: Python 3 traverse_postorder_n_ary 1`] = `
1752+
"from typing import Generator, Optional, List
1753+
1754+
1755+
class TreeNode:
1756+
def __init__(
1757+
self,
1758+
val: int = 0,
1759+
children: List["TreeNode"] = [],
1760+
):
1761+
self.val = val
1762+
self.children = children
1763+
1764+
1765+
def traverse_postorder_n_ary(
1766+
root: Optional[TreeNode],
1767+
) -> Generator[TreeNode, None, None]:
1768+
stack = [(root, False)]
1769+
while stack:
1770+
node, did_traverse_children = stack.pop()
1771+
if not node:
1772+
continue
1773+
1774+
if did_traverse_children:
1775+
yield node
1776+
continue
1777+
1778+
stack.append((node, True))
1779+
for child in reversed(node.children):
1780+
stack.append((child, False))"
1781+
`;
1782+
17511783
exports[`App can render goody: Python 3 traverse_preorder 1`] = `
17521784
"from typing import Generator, Optional
17531785

0 commit comments

Comments
 (0)