Skip to content

Commit fe2badb

Browse files
committed
Update binary_tree_traversals.py
1 parent c76fce4 commit fe2badb

1 file changed

Lines changed: 87 additions & 198 deletions

File tree

Lines changed: 87 additions & 198 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,25 @@
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+
57
import queue
68

79

810
class 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

Comments
 (0)