-
-
Notifications
You must be signed in to change notification settings - Fork 46.6k
/
Copy pathbinary_tree_traversals.py
161 lines (137 loc) · 3.94 KB
/
binary_tree_traversals.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
class Node:
"""
A Node has data variable and pointers toits left and right nodes.
"""
def __init__(self, data):
self.left = None
self.right = None
self.data = data
def preorder(root):
"""
PreOrder traversal: visit root node then its left subtree followed by right subtree.
"""
if root:
print(root.data, end=" ")
preorder(root.left)
preorder(root.right)
def postorder(root):
"""
PostOrder traversal: visit left subtree followed by right subtree and then root node.
"""
if root:
postorder(root.left)
postorder(root.right)
print(root.data, end=" ")
def inorder(root):
"""
InOrder traversal: visit its left subtree followed by root node and then right subtree.
"""
if root:
inorder(root.left)
print(root.data, end=" ")
inorder(root.right)
def height(root):
"""
Recursive function for calculating height of the binary tree.
"""
if not root:
return 0
left_Height = height(root.left)
right_Height = height(root.right)
if left_Height > right_Height:
return left_Height + 1
else:
return right_Height + 1
def levelorder1(root):
"""
Print whole binary tree in Level Order Traverse.
Level Order traverse: Visit nodes of the tree level-by-level.
"""
if not root:
return
temp = root
que = [temp]
while len(que) > 0:
print(que[0].data, end=" ")
temp = que.pop(0)
if temp.left:
que.append(temp.left)
if temp.right:
que.append(temp.right)
def levelorder2(root, level):
"""
Level-wise traversal:
Print all nodes present at the given level of the binary tree.
"""
if not root:
return root
if level == 1:
print(root.data, end=" ")
elif level > 1:
levelorder2(root.left, level - 1)
levelorder2(root.right, level - 1)
def print_left_to_right(root, level):
"""
Print elements on particular level from left to right direction of the binary tree.
"""
if not root:
return
if level == 1:
print(root.data, end=" ")
elif level > 1:
print_left_to_right(root.left, level - 1)
print_left_to_right(root.right, level - 1)
def print_right_to_left(root, level):
"""
Print elements on particular level from right to left direction of the binary tree.
"""
if not root:
return
if level == 1:
print(root.data, end=" ")
elif level > 1:
print_right_to_left(root.right, level - 1)
print_right_to_left(root.left, level - 1)
def zigzag(root):
"""
ZigZag traverse: Print node left to right and right to left, alternatively.
"""
flag = 0
height_tree = height(root)
for h in range(1, height_tree + 1):
if flag == 0:
print_left_to_right(root, h)
flag = 1
else:
print_right_to_left(root, h)
flag = 0
def main(): # Main function for testing.
"""
Create binary tree.
"""
root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
"""
All Traversals of the binary are as follows:
"""
print("In order Traversal is : ")
inorder(root)
print("\nPre order Traversal is : ")
preorder(root)
print("\nPost order Traversal is : ")
postorder(root)
print("\nHeight of Tree is : ")
height_tree = height(root)
print(height_tree)
print("\nComplete Level Order Traversal is : ")
levelorder1(root)
print("\nLevel-wise order Traversal is : ")
for h in range(1, height_tree + 1):
levelorder2(root, h)
print("\nZigZag order Traversal is : ")
zigzag(root)
if __name__ == "__main__":
main()