1
+ import collections
2
+ from graphical import drawtree , Banching
3
+ NodesBeenMade = 0
4
+
5
+ class Node :
6
+ def __init__ (self , data ) :
7
+ self .left = None
8
+ self .right = None
9
+ self .value = data
10
+
11
+ def addLeftChild (self , value : int ):
12
+ self .left = Node (value )
13
+ return self .left
14
+
15
+ def addRightChild (self , value : int ):
16
+ self .right = Node (value )
17
+ return self .right
18
+
19
+
20
+
21
+
22
+ def __repr__ (self ):
23
+ return "Node data : " + str (self .value )
24
+
25
+
26
+ class BinaryTree :
27
+ def __init__ (self , data : list or Node ) -> None :
28
+
29
+ self .data = data
30
+ self .root = None
31
+
32
+ if type (data ) == list :
33
+ for number in data :
34
+ self ._branching (self .root , number )
35
+ elif type (data ) == Node :
36
+ self .root = data
37
+ else :
38
+ print ("wrong input type -> allowed types (list[numbers], TreeNode), entered type -> {}" .format (type (data )))
39
+ exit (- 1 )
40
+
41
+
42
+
43
+ def _branching (self , node : Node , data : int ) :
44
+
45
+ if self .root == None :
46
+ self .root = Node (data )
47
+ else :
48
+ if node .value > data :
49
+ if node .left != None :
50
+ self ._branching (node .left , data )
51
+ else :
52
+ node .addLeftChild (data )
53
+ elif node .value < data :
54
+ if node .right != None :
55
+ self ._branching (node .right , data )
56
+ else :
57
+ node .addRightChild (data )
58
+ elif node .value == data :
59
+ print ("you can't insert duplicate value" )
60
+ return - 1
61
+
62
+
63
+ def PrintTree (self , trav_type ) :
64
+
65
+ """ Print tree using your desired traversal
66
+
67
+ Returns:
68
+ desired traversal
69
+ """
70
+
71
+ if trav_type == "1" :
72
+ return self .preorder_tree (self .root , "" )
73
+ elif trav_type == "2" :
74
+ return self .inorder_tree (self .root , "" )
75
+ elif trav_type == "3" :
76
+ return self .postorder_tree (self .root , "" )
77
+ elif trav_type == "4" :
78
+ return self .levelorder_tree (self .root )
79
+ else :
80
+ print ("Invalid input !" )
81
+
82
+ def preorder_tree (self , start : Node , trav ) :
83
+
84
+ """ Preorder from root to left then right
85
+
86
+ Returns:
87
+ preorder traversal
88
+ """
89
+
90
+ if start :
91
+ global NodesBeenMade
92
+ NodesBeenMade += 1
93
+ trav += (str (start .value ) + "," )
94
+ trav = self .preorder_tree (start .left , trav )
95
+ trav = self .preorder_tree (start .right , trav )
96
+ return trav
97
+
98
+ def inorder_tree (self , start : Node , trav ) :
99
+
100
+ """ Inorder from left to root then right
101
+
102
+ Returns:
103
+ inorder traversal
104
+ """
105
+
106
+ if start :
107
+ global NodesBeenMade
108
+ NodesBeenMade += 1
109
+ trav = self .inorder_tree (start .left , trav )
110
+ trav += (str (start .value ) + "," )
111
+ trav = self .inorder_tree (start .right , trav )
112
+ return trav
113
+
114
+ def postorder_tree (self , start : Node , trav ) :
115
+
116
+ """ Postorder from left to right then root
117
+
118
+ Returns:
119
+ postorder traversal
120
+ """
121
+
122
+ if start :
123
+ global NodesBeenMade
124
+ NodesBeenMade += 1
125
+ trav = self .postorder_tree (start .left , trav )
126
+ trav = self .postorder_tree (start .right , trav )
127
+ trav += (str (start .value ) + "," )
128
+ return trav
129
+
130
+ def levelorder_tree (self , start ) :
131
+
132
+ """ Levelorder itrating over tree in the levels
133
+
134
+ Returns:
135
+ levelorder traversal
136
+ """
137
+
138
+ ans = []
139
+ if start is None :
140
+ return ans
141
+
142
+ queue = collections .deque ()
143
+ queue .append (start )
144
+
145
+ while queue :
146
+ currSize = len (queue )
147
+ currList = []
148
+
149
+ while currSize > 0 :
150
+ currNode = queue .popleft ()
151
+ currList .append (currNode .value )
152
+ currSize -= 1
153
+
154
+ if currNode .left is not None :
155
+ queue .append (currNode .left )
156
+
157
+ if currNode .right is not None :
158
+ queue .append (currNode .right )
159
+ ans .append (currList )
160
+ return ans
161
+
162
+ def floors_number (self , node ) :
163
+ if node is None :
164
+ return 0
165
+ left = self .floors_number (node .left )
166
+ right = self .floors_number (node .right )
167
+ return max (left , right ) + 1
168
+
169
+ def delete_tree (self ) :
170
+
171
+ """ Delete the tree
172
+
173
+ Returns :
174
+ for deleting
175
+ """
176
+ self .root = None
177
+
178
+ def MAX (self ) :
179
+
180
+ """ Max and Min in the tree :
181
+ used a traversal so we can itrate
182
+
183
+ Returns:
184
+ _type_: _description_
185
+ """
186
+ result = self .PrintTree ("1" )
187
+ result = result .split ("," )
188
+ result .pop ()
189
+ result = [int (x ) for x in result ]
190
+
191
+ return max (result )
192
+
193
+ def MIN (self ) :
194
+
195
+ """ Max and Min in the tree :
196
+ used a traversal so we can itrate
197
+
198
+ Returns:
199
+ _type_: _description_
200
+ """
201
+
202
+ result = self .PrintTree ("1" )
203
+ result = result .split ("," )
204
+ result .pop ()
205
+ result = [int (x ) for x in result ]
206
+
207
+ return min (result )
208
+
209
+
210
+ def compare (self ) :
211
+ """ been made in the main function
212
+ """
213
+ pass
214
+
215
+ def draw (self ) :
216
+
217
+ """ Draw tree
218
+
219
+ drawing tree using personal module
220
+ first we branch our data and then we draw our tree
221
+
222
+ Returns :
223
+ Graphical tree using python's turtle
224
+
225
+ """
226
+ Banching (self .data )
227
+ drawtree ()
228
+
229
+ def numberOfLeafs (self , node : Node ) :
230
+ if node is None :
231
+ return 0
232
+ if (node .left is None and node .right is None ):
233
+ return 1
234
+ else :
235
+ return self .numberOfLeafs (node .left ) + self .numberOfLeafs (node .right )
236
+
237
+ def search (self , node : Node , Arg : int ) :
238
+ """ Binary search
239
+ implanting binary search on the tree and compare two nodes with each other
240
+ search will go to right node if arg is bigger and go to left if arg is smaller
241
+
242
+ Returns:
243
+ Node
244
+ """
245
+ if node is None or node .value == Arg :
246
+ return node
247
+
248
+ if node .value > Arg :
249
+ return self .search (node .left , Arg )
250
+ elif node .value < Arg :
251
+ return self .search (node .right , Arg )
252
+
253
+
254
+ def FullTree (self , node ) :
255
+ queue = list ()
256
+ queue .append (node )
257
+
258
+ while queue != []:
259
+ temp = queue .pop ()
260
+
261
+ if temp .left == None and temp .right == None :
262
+ continue
263
+ elif temp .right != None and temp .left != None :
264
+ queue .append (temp .right )
265
+ queue .append (temp .left )
266
+ else :
267
+ return False
268
+ return True
269
+
270
+
271
+ def isComplete (self ):
272
+ def RisComplete (node : Node , index : int , nodeCount : int ) :
273
+ if node == None :
274
+ return True
275
+ if index >= nodeCount :
276
+ return False
277
+ return RisComplete (node .left , 2 * index + 1 , nodeCount ) and RisComplete (node .right , 2 * index + 2 , nodeCount )
278
+
279
+ def get_count_of_children (self ) :
280
+ def count_of_children (node : Node ) : # recursive call
281
+ if (node == None ):
282
+ return 0 ;
283
+ return (1 + count_of_children (node .left ) + count_of_children (node .right ))
284
+ return count_of_children (self .root ) - 1
285
+
286
+ def number_of_nodes (self ) :
287
+ def count_nodes (node , counter = 0 ) :
288
+ if node :
289
+ counter += 1
290
+ counter = count_nodes (node .right , counter )
291
+ counter = count_nodes (node .left , counter )
292
+ return counter
293
+
294
+ return count_nodes (self .root )
295
+
296
+ def depth (self , node ) :
297
+ if node is None :
298
+ return 0
299
+ left = self .floors_number (node .left )
300
+ right = self .floors_number (node .right )
301
+ return max (left , right )
0 commit comments