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