Skip to content

Commit e035c61

Browse files
rajansh87cclauss
andauthored
add binary_tree_traversals.py to data_structures (#3297)
* add binary_tree_traversals.py to data_structures I have added some interesting binary tree traversing methods. * Fixed error * Update data_structures/binary_tree/binary_tree_traversals.py Co-authored-by: Christian Clauss <[email protected]> * Update binary_tree_traversals.py * Update binary_tree_traversals.py * Update binary_tree_traversals.py * Update data_structures/binary_tree/binary_tree_traversals.py Co-authored-by: Christian Clauss <[email protected]> * Update binary_tree_traversals.py * Update binary_tree_traversals.py * Update binary_tree_traversals.py * Update binary_tree_traversals.py * Update binary_tree_traversals.py * Update binary_tree_traversals.py * Update binary_tree_traversals.py * Update binary_tree_traversals.py * Update binary_tree_traversals.py * Update binary_tree_traversals.py * Update data_structures/binary_tree/binary_tree_traversals.py Co-authored-by: Christian Clauss <[email protected]> * Update binary_tree_traversals.py * Update binary_tree_traversals.py * Update data_structures/binary_tree/binary_tree_traversals.py Co-authored-by: Christian Clauss <[email protected]> * Update data_structures/binary_tree/binary_tree_traversals.py Co-authored-by: Christian Clauss <[email protected]> * Update binary_tree_traversals.py * Update data_structures/binary_tree/binary_tree_traversals.py Co-authored-by: Christian Clauss <[email protected]> * Update binary_tree_traversals.py * Doctests and type hints * Add spaces * Update binary_tree_traversals.py * black exclude data_structures/binary_tree/binary_tree_traversals.py * Add spaces again * Update binary_tree_traversals.py Co-authored-by: Christian Clauss <[email protected]>
1 parent 9482f6a commit e035c61

File tree

2 files changed

+165
-0
lines changed

2 files changed

+165
-0
lines changed

Diff for: .pre-commit-config.yaml

+4
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ repos:
1818
rev: stable
1919
hooks:
2020
- id: black
21+
exclude: |
22+
(?x)^(
23+
data_structures/binary_tree/binary_tree_traversals.py
24+
)$
2125
- repo: https://github.com/PyCQA/isort
2226
rev: 5.5.3
2327
hooks:
+161
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
# https://en.wikipedia.org/wiki/Tree_traversal
2+
3+
4+
class Node:
5+
"""
6+
A Node has data variable and pointers to its left and right nodes.
7+
"""
8+
9+
def __init__(self, data):
10+
self.left = None
11+
self.right = None
12+
self.data = data
13+
14+
15+
def make_tree() -> Node:
16+
root = Node(1)
17+
root.left = Node(2)
18+
root.right = Node(3)
19+
root.left.left = Node(4)
20+
root.left.right = Node(5)
21+
return root
22+
23+
24+
def preorder(root: Node):
25+
"""
26+
Pre-order traversal visits root node, left subtree, right subtree.
27+
>>> preorder(make_tree())
28+
[1, 2, 4, 5, 3]
29+
"""
30+
return [root.data] + preorder(root.left) + preorder(root.right) if root else []
31+
32+
33+
def postorder(root: Node):
34+
"""
35+
Post-order traversal visits left subtree, right subtree, root node.
36+
>>> postorder(make_tree())
37+
[4, 5, 2, 3, 1]
38+
"""
39+
return postorder(root.left) + postorder(root.right) + [root.data] if root else []
40+
41+
42+
def inorder(root: Node):
43+
"""
44+
In-order traversal visits left subtree, root node, right subtree.
45+
>>> inorder(make_tree())
46+
[4, 2, 5, 1, 3]
47+
"""
48+
return inorder(root.left) + [root.data] + inorder(root.right) if root else []
49+
50+
51+
def height(root: Node):
52+
"""
53+
Recursive function for calculating the height of the binary tree.
54+
>>> height(None)
55+
0
56+
>>> height(make_tree())
57+
3
58+
"""
59+
return (max(height(root.left), height(root.right)) + 1) if root else 0
60+
61+
62+
def level_order_1(root: Node):
63+
"""
64+
Print whole binary tree in Level Order Traverse.
65+
Level Order traverse: Visit nodes of the tree level-by-level.
66+
"""
67+
if not root:
68+
return
69+
temp = root
70+
que = [temp]
71+
while len(que) > 0:
72+
print(que[0].data, end=" ")
73+
temp = que.pop(0)
74+
if temp.left:
75+
que.append(temp.left)
76+
if temp.right:
77+
que.append(temp.right)
78+
return que
79+
80+
81+
def level_order_2(root: Node, level: int):
82+
"""
83+
Level-wise traversal: Print all nodes present at the given level of the binary tree
84+
"""
85+
if not root:
86+
return root
87+
if level == 1:
88+
print(root.data, end=" ")
89+
elif level > 1:
90+
level_order_2(root.left, level - 1)
91+
level_order_2(root.right, level - 1)
92+
93+
94+
def print_left_to_right(root: Node, level: int):
95+
"""
96+
Print elements on particular level from left to right direction of the binary tree.
97+
"""
98+
if not root:
99+
return
100+
if level == 1:
101+
print(root.data, end=" ")
102+
elif level > 1:
103+
print_left_to_right(root.left, level - 1)
104+
print_left_to_right(root.right, level - 1)
105+
106+
107+
def print_right_to_left(root: Node, level: int):
108+
"""
109+
Print elements on particular level from right to left direction of the binary tree.
110+
"""
111+
if not root:
112+
return
113+
if level == 1:
114+
print(root.data, end=" ")
115+
elif level > 1:
116+
print_right_to_left(root.right, level - 1)
117+
print_right_to_left(root.left, level - 1)
118+
119+
120+
def zigzag(root: Node):
121+
"""
122+
ZigZag traverse: Print node left to right and right to left, alternatively.
123+
"""
124+
flag = 0
125+
height_tree = height(root)
126+
for h in range(1, height_tree + 1):
127+
if flag == 0:
128+
print_left_to_right(root, h)
129+
flag = 1
130+
else:
131+
print_right_to_left(root, h)
132+
flag = 0
133+
134+
135+
def main(): # Main function for testing.
136+
"""
137+
Create binary tree.
138+
"""
139+
root = make_tree()
140+
"""
141+
All Traversals of the binary are as follows:
142+
"""
143+
print(f" In-order Traversal is {inorder(root)}")
144+
print(f" Pre-order Traversal is {preorder(root)}")
145+
print(f"Post-order Traversal is {postorder(root)}")
146+
print(f"Height of Tree is {height(root)}")
147+
print("Complete Level Order Traversal is : ")
148+
level_order_1(root)
149+
print("\nLevel-wise order Traversal is : ")
150+
for h in range(1, height(root) + 1):
151+
level_order_2(root, h)
152+
print("\nZigZag order Traversal is : ")
153+
zigzag(root)
154+
print()
155+
156+
157+
if __name__ == "__main__":
158+
import doctest
159+
160+
doctest.testmod()
161+
main()

0 commit comments

Comments
 (0)