11"""
2- This is pure python implementation of Trie traversal algorithms
2+ This is pure Python implementation of binary tree traversal algorithms.
33"""
44
5+ from __future__ import annotations
6+
57import queue
68
79
810class TreeNode :
9- def __init__ (self , data ):
11+ def __init__ (self , data : int ):
1012 self .data = data
11- self .right = None
12- self .left = None
13+ self .right : TreeNode | None = None
14+ self .left : TreeNode | None = None
1315
1416
15- def build_tree ():
17+ def build_tree () -> TreeNode | None :
1618 print ("\n ********Press N to stop entering at any point of time********\n " )
1719 check = input ("Enter the value of the root node: " ).strip ().lower () or "n"
1820 if check == "n" :
1921 return None
20- q : queue .Queue = queue .Queue ()
22+ q : queue .Queue [ TreeNode ] = queue .Queue ()
2123 tree_node = TreeNode (int (check ))
2224 q .put (tree_node )
2325 while not q .empty ():
@@ -36,93 +38,38 @@ def build_tree():
3638 right_node = TreeNode (int (check ))
3739 node_found .right = right_node
3840 q .put (right_node )
41+ return tree_node
3942
4043
41- def pre_order (node : TreeNode ) -> None :
42- """
43- >>> root = TreeNode(1)
44- >>> tree_node2 = TreeNode(2)
45- >>> tree_node3 = TreeNode(3)
46- >>> tree_node4 = TreeNode(4)
47- >>> tree_node5 = TreeNode(5)
48- >>> tree_node6 = TreeNode(6)
49- >>> tree_node7 = TreeNode(7)
50- >>> root.left, root.right = tree_node2, tree_node3
51- >>> tree_node2.left, tree_node2.right = tree_node4 , tree_node5
52- >>> tree_node3.left, tree_node3.right = tree_node6 , tree_node7
53- >>> pre_order(root)
54- 1 2 4 5 3 6 7
55- """
56- if not isinstance (node , TreeNode ) or not node :
44+ def pre_order (root : TreeNode | None ) -> None :
45+ if not isinstance (root , TreeNode ) or not root :
5746 return
58- print (node .data , end = " " )
59- pre_order (node .left )
60- pre_order (node .right )
61-
62-
63- def in_order (node : TreeNode ) -> None :
64- """
65- >>> root = TreeNode(1)
66- >>> tree_node2 = TreeNode(2)
67- >>> tree_node3 = TreeNode(3)
68- >>> tree_node4 = TreeNode(4)
69- >>> tree_node5 = TreeNode(5)
70- >>> tree_node6 = TreeNode(6)
71- >>> tree_node7 = TreeNode(7)
72- >>> root.left, root.right = tree_node2, tree_node3
73- >>> tree_node2.left, tree_node2.right = tree_node4 , tree_node5
74- >>> tree_node3.left, tree_node3.right = tree_node6 , tree_node7
75- >>> in_order(root)
76- 4 2 5 1 6 3 7
77- """
78- if not isinstance (node , TreeNode ) or not node :
47+ print (root .data , end = " " )
48+ pre_order (root .left )
49+ pre_order (root .right )
50+
51+
52+ def in_order (root : TreeNode | None ) -> None :
53+ if not isinstance (root , TreeNode ) or not root :
7954 return
80- in_order (node .left )
81- print (node .data , end = " " )
82- in_order (node .right )
83-
84-
85- def post_order (node : TreeNode ) -> None :
86- """
87- >>> root = TreeNode(1)
88- >>> tree_node2 = TreeNode(2)
89- >>> tree_node3 = TreeNode(3)
90- >>> tree_node4 = TreeNode(4)
91- >>> tree_node5 = TreeNode(5)
92- >>> tree_node6 = TreeNode(6)
93- >>> tree_node7 = TreeNode(7)
94- >>> root.left, root.right = tree_node2, tree_node3
95- >>> tree_node2.left, tree_node2.right = tree_node4 , tree_node5
96- >>> tree_node3.left, tree_node3.right = tree_node6 , tree_node7
97- >>> post_order(root)
98- 4 5 2 6 7 3 1
99- """
100- if not isinstance (node , TreeNode ) or not node :
55+ in_order (root .left )
56+ print (root .data , end = " " )
57+ in_order (root .right )
58+
59+
60+ def post_order (root : TreeNode | None ) -> None :
61+ if not isinstance (root , TreeNode ) or not root :
10162 return
102- post_order (node .left )
103- post_order (node .right )
104- print (node .data , end = " " )
105-
106-
107- def level_order (node : TreeNode ) -> None :
108- """
109- >>> root = TreeNode(1)
110- >>> tree_node2 = TreeNode(2)
111- >>> tree_node3 = TreeNode(3)
112- >>> tree_node4 = TreeNode(4)
113- >>> tree_node5 = TreeNode(5)
114- >>> tree_node6 = TreeNode(6)
115- >>> tree_node7 = TreeNode(7)
116- >>> root.left, root.right = tree_node2, tree_node3
117- >>> tree_node2.left, tree_node2.right = tree_node4 , tree_node5
118- >>> tree_node3.left, tree_node3.right = tree_node6 , tree_node7
119- >>> level_order(root)
120- 1 2 3 4 5 6 7
121- """
122- if not isinstance (node , TreeNode ) or not node :
63+ post_order (root .left )
64+ post_order (root .right )
65+ print (root .data , end = " " )
66+
67+
68+ def level_order (root : TreeNode | None ) -> None :
69+ if not isinstance (root , TreeNode ) or not root :
12370 return
124- q : queue .Queue = queue .Queue ()
125- q .put (node )
71+ q : queue .Queue [ TreeNode ] = queue .Queue ()
72+ q .put (root )
12673 while not q .empty ():
12774 node_dequeued = q .get ()
12875 print (node_dequeued .data , end = " " )
@@ -132,127 +79,69 @@ def level_order(node: TreeNode) -> None:
13279 q .put (node_dequeued .right )
13380
13481
135- def level_order_actual (node : TreeNode ) -> None :
136- """
137- >>> root = TreeNode(1)
138- >>> tree_node2 = TreeNode(2)
139- >>> tree_node3 = TreeNode(3)
140- >>> tree_node4 = TreeNode(4)
141- >>> tree_node5 = TreeNode(5)
142- >>> tree_node6 = TreeNode(6)
143- >>> tree_node7 = TreeNode(7)
144- >>> root.left, root.right = tree_node2, tree_node3
145- >>> tree_node2.left, tree_node2.right = tree_node4 , tree_node5
146- >>> tree_node3.left, tree_node3.right = tree_node6 , tree_node7
147- >>> level_order_actual(root)
148- 1
149- 2 3
150- 4 5 6 7
151- """
152- if not isinstance (node , TreeNode ) or not node :
82+ def level_order_actual (root : TreeNode | None ) -> None :
83+ if not isinstance (root , TreeNode ) or not root :
15384 return
154- q : queue .Queue = queue .Queue ()
155- q .put (node )
85+ q : queue .Queue [ TreeNode ] = queue .Queue ()
86+ q .put (root )
15687 while not q .empty ():
157- list = []
88+ next_level_nodes : list [ TreeNode ] = []
15889 while not q .empty ():
15990 node_dequeued = q .get ()
16091 print (node_dequeued .data , end = " " )
16192 if node_dequeued .left :
162- list .append (node_dequeued .left )
93+ next_level_nodes .append (node_dequeued .left )
16394 if node_dequeued .right :
164- list .append (node_dequeued .right )
95+ next_level_nodes .append (node_dequeued .right )
16596 print ()
166- for node in list :
167- q .put (node )
97+ for child in next_level_nodes :
98+ q .put (child )
16899
169100
170101# iteration version
171- def pre_order_iter (node : TreeNode ) -> None :
172- """
173- >>> root = TreeNode(1)
174- >>> tree_node2 = TreeNode(2)
175- >>> tree_node3 = TreeNode(3)
176- >>> tree_node4 = TreeNode(4)
177- >>> tree_node5 = TreeNode(5)
178- >>> tree_node6 = TreeNode(6)
179- >>> tree_node7 = TreeNode(7)
180- >>> root.left, root.right = tree_node2, tree_node3
181- >>> tree_node2.left, tree_node2.right = tree_node4 , tree_node5
182- >>> tree_node3.left, tree_node3.right = tree_node6 , tree_node7
183- >>> pre_order_iter(root)
184- 1 2 4 5 3 6 7
185- """
186- if not isinstance (node , TreeNode ) or not node :
102+ def pre_order_iter (root : TreeNode | None ) -> None :
103+ if not isinstance (root , TreeNode ) or not root :
187104 return
188105 stack : list [TreeNode ] = []
189- n = node
190- while n or stack :
191- while n : # start from root node, find its left child
192- print (n .data , end = " " )
193- stack .append (n )
194- n = n .left
106+ current : TreeNode | None = root
107+ while current or stack :
108+ while current : # start from root node, find its left child
109+ print (current .data , end = " " )
110+ stack .append (current )
111+ current = current .left
195112 # end of while means current node doesn't have left child
196- n = stack .pop ()
113+ current = stack .pop ()
197114 # start to traverse its right child
198- n = n .right
199-
200-
201- def in_order_iter (node : TreeNode ) -> None :
202- """
203- >>> root = TreeNode(1)
204- >>> tree_node2 = TreeNode(2)
205- >>> tree_node3 = TreeNode(3)
206- >>> tree_node4 = TreeNode(4)
207- >>> tree_node5 = TreeNode(5)
208- >>> tree_node6 = TreeNode(6)
209- >>> tree_node7 = TreeNode(7)
210- >>> root.left, root.right = tree_node2, tree_node3
211- >>> tree_node2.left, tree_node2.right = tree_node4 , tree_node5
212- >>> tree_node3.left, tree_node3.right = tree_node6 , tree_node7
213- >>> in_order_iter(root)
214- 4 2 5 1 6 3 7
215- """
216- if not isinstance (node , TreeNode ) or not node :
115+ current = current .right
116+
117+
118+ def in_order_iter (root : TreeNode | None ) -> None :
119+ if not isinstance (root , TreeNode ) or not root :
217120 return
218121 stack : list [TreeNode ] = []
219- n = node
220- while n or stack :
221- while n :
222- stack .append (n )
223- n = n .left
224- n = stack .pop ()
225- print (n .data , end = " " )
226- n = n .right
227-
228-
229- def post_order_iter (node : TreeNode ) -> None :
230- """
231- >>> root = TreeNode(1)
232- >>> tree_node2 = TreeNode(2)
233- >>> tree_node3 = TreeNode(3)
234- >>> tree_node4 = TreeNode(4)
235- >>> tree_node5 = TreeNode(5)
236- >>> tree_node6 = TreeNode(6)
237- >>> tree_node7 = TreeNode(7)
238- >>> root.left, root.right = tree_node2, tree_node3
239- >>> tree_node2.left, tree_node2.right = tree_node4 , tree_node5
240- >>> tree_node3.left, tree_node3.right = tree_node6 , tree_node7
241- >>> post_order_iter(root)
242- 4 5 2 6 7 3 1
243- """
244- if not isinstance (node , TreeNode ) or not node :
122+ current : TreeNode | None = root
123+ while current or stack :
124+ while current :
125+ stack .append (current )
126+ current = current .left
127+ current = stack .pop ()
128+ print (current .data , end = " " )
129+ current = current .right
130+
131+
132+ def post_order_iter (root : TreeNode | None ) -> None :
133+ if not isinstance (root , TreeNode ) or not root :
245134 return
246- stack1 , stack2 = [], []
247- n = node
248- stack1 .append (n )
135+ stack1 : list [ TreeNode ] = []
136+ stack2 : list [ TreeNode ] = []
137+ stack1 .append (root )
249138 while stack1 : # to find the reversed order of post order, store it in stack2
250- n = stack1 .pop ()
251- if n .left :
252- stack1 .append (n .left )
253- if n .right :
254- stack1 .append (n .right )
255- stack2 .append (n )
139+ current = stack1 .pop ()
140+ if current .left :
141+ stack1 .append (current .left )
142+ if current .right :
143+ stack1 .append (current .right )
144+ stack2 .append (current )
256145 while stack2 : # pop up from stack2 will be the post order
257146 print (stack2 .pop ().data , end = " " )
258147
@@ -270,35 +159,35 @@ def prompt(s: str = "", width=50, char="*") -> str:
270159 doctest .testmod ()
271160 print (prompt ("Binary Tree Traversals" ))
272161
273- node = build_tree ()
162+ root = build_tree ()
274163 print (prompt ("Pre Order Traversal" ))
275- pre_order (node )
164+ pre_order (root )
276165 print (prompt () + "\n " )
277166
278167 print (prompt ("In Order Traversal" ))
279- in_order (node )
168+ in_order (root )
280169 print (prompt () + "\n " )
281170
282171 print (prompt ("Post Order Traversal" ))
283- post_order (node )
172+ post_order (root )
284173 print (prompt () + "\n " )
285174
286175 print (prompt ("Level Order Traversal" ))
287- level_order (node )
176+ level_order (root )
288177 print (prompt () + "\n " )
289178
290179 print (prompt ("Actual Level Order Traversal" ))
291- level_order_actual (node )
180+ level_order_actual (root )
292181 print ("*" * 50 + "\n " )
293182
294183 print (prompt ("Pre Order Traversal - Iteration Version" ))
295- pre_order_iter (node )
184+ pre_order_iter (root )
296185 print (prompt () + "\n " )
297186
298187 print (prompt ("In Order Traversal - Iteration Version" ))
299- in_order_iter (node )
188+ in_order_iter (root )
300189 print (prompt () + "\n " )
301190
302191 print (prompt ("Post Order Traversal - Iteration Version" ))
303- post_order_iter (node )
192+ post_order_iter (root )
304193 print (prompt ())
0 commit comments