1
- # https://en.wikipedia.org/wiki/Tree_traversal
2
1
from __future__ import annotations
3
2
4
3
from collections import deque
5
- from collections .abc import Sequence
4
+ from collections .abc import Generator , Sequence
6
5
from dataclasses import dataclass
7
6
from typing import Any
8
7
9
8
9
+ # https://en.wikipedia.org/wiki/Tree_traversal
10
10
@dataclass
11
11
class Node :
12
12
data : int
@@ -31,44 +31,56 @@ def make_tree() -> Node | None:
31
31
return tree
32
32
33
33
34
- def preorder (root : Node | None ) -> list [int ]:
34
+ def preorder (root : Node | None ) -> Generator [int , None , None ]:
35
35
"""
36
36
Pre-order traversal visits root node, left subtree, right subtree.
37
- >>> preorder(make_tree())
37
+ >>> list( preorder(make_tree() ))
38
38
[1, 2, 4, 5, 3]
39
39
"""
40
- return [root .data , * preorder (root .left ), * preorder (root .right )] if root else []
40
+ if not root :
41
+ return
42
+ yield root .data
43
+ yield from preorder (root .left )
44
+ yield from preorder (root .right )
41
45
42
46
43
- def postorder (root : Node | None ) -> list [int ]:
47
+ def postorder (root : Node | None ) -> Generator [int , None , None ]:
44
48
"""
45
49
Post-order traversal visits left subtree, right subtree, root node.
46
- >>> postorder(make_tree())
50
+ >>> list( postorder(make_tree() ))
47
51
[4, 5, 2, 3, 1]
48
52
"""
49
- return postorder (root .left ) + postorder (root .right ) + [root .data ] if root else []
53
+ if not root :
54
+ return
55
+ yield from postorder (root .left )
56
+ yield from postorder (root .right )
57
+ yield root .data
50
58
51
59
52
- def inorder (root : Node | None ) -> list [int ]:
60
+ def inorder (root : Node | None ) -> Generator [int , None , None ]:
53
61
"""
54
62
In-order traversal visits left subtree, root node, right subtree.
55
- >>> inorder(make_tree())
63
+ >>> list( inorder(make_tree() ))
56
64
[4, 2, 5, 1, 3]
57
65
"""
58
- return [* inorder (root .left ), root .data , * inorder (root .right )] if root else []
66
+ if not root :
67
+ return
68
+ yield from inorder (root .left )
69
+ yield root .data
70
+ yield from inorder (root .right )
59
71
60
72
61
- def reverse_inorder (root : Node | None ) -> list [int ]:
73
+ def reverse_inorder (root : Node | None ) -> Generator [int , None , None ]:
62
74
"""
63
75
Reverse in-order traversal visits right subtree, root node, left subtree.
64
- >>> reverse_inorder(make_tree())
76
+ >>> list( reverse_inorder(make_tree() ))
65
77
[3, 1, 5, 2, 4]
66
78
"""
67
- return (
68
- [ * reverse_inorder ( root . right ), root . data , * reverse_inorder ( root . left )]
69
- if root
70
- else []
71
- )
79
+ if not root :
80
+ return
81
+ yield from reverse_inorder ( root . right )
82
+ yield root . data
83
+ yield from reverse_inorder ( root . left )
72
84
73
85
74
86
def height (root : Node | None ) -> int :
@@ -178,10 +190,10 @@ def main() -> None: # Main function for testing.
178
190
root = make_tree ()
179
191
180
192
# All Traversals of the binary are as follows:
181
- print (f"In-order Traversal: { inorder (root )} " )
182
- print (f"Reverse In-order Traversal: { reverse_inorder (root )} " )
183
- print (f"Pre-order Traversal: { preorder (root )} " )
184
- print (f"Post-order Traversal: { postorder (root )} " , "\n " )
193
+ print (f"In-order Traversal: { list ( inorder (root ) )} " )
194
+ print (f"Reverse In-order Traversal: { list ( reverse_inorder (root ) )} " )
195
+ print (f"Pre-order Traversal: { list ( preorder (root ) )} " )
196
+ print (f"Post-order Traversal: { list ( postorder (root ) )} " , "\n " )
185
197
186
198
print (f"Height of Tree: { height (root )} " , "\n " )
187
199
0 commit comments