11import collections
2- from graphical import drawtree , deserialize
3-
2+ from graphical import drawtree , Banching
43NodesBeenMade = 0
54
65class Node :
76 def __init__ (self , data ) :
87 self .left = None
98 self .right = None
10- self .data = data
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 "value of node equals by -> " + str (self .value )
24+
1125
1226class BinaryTree :
13- def __init__ (self , root ) :
14- self .root = Node (root )
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+
1562
1663 def PrintTree (self , trav_type ) :
17- if trav_type == "preorder" :
18- return self .preorder_tree (tree .root , "" )
19- elif trav_type == "inorder" :
20- return self .inorder_tree (tree .root , "" )
21- elif trav_type == "postorder" :
22- return self .postorder_tree (tree .root , "" )
23- elif trav_type == "levelorder" :
24- return self .levelorder_tree (tree .root )
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 )
2579 else :
26- return False
80+ print ( "Invalid input !" )
2781
28- def preorder_tree (self , start , trav ) :
29- ## ROOT > LEFT > RIGHT
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+
3090 if start :
3191 global NodesBeenMade
3292 NodesBeenMade += 1
33- trav += (str (start .data ) + "," )
93+ trav += (str (start .value ) + "," )
3494 trav = self .preorder_tree (start .left , trav )
3595 trav = self .preorder_tree (start .right , trav )
3696 return trav
3797
38- def inorder_tree (self , start , trav ) :
39- ## LEFT > ROOT > RIGHT
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+
40106 if start :
41107 global NodesBeenMade
42108 NodesBeenMade += 1
43109 trav = self .inorder_tree (start .left , trav )
44- trav += (str (start .data ) + "," )
110+ trav += (str (start .value ) + "," )
45111 trav = self .inorder_tree (start .right , trav )
46112 return trav
47113
48- def postorder_tree (self , start , trav ) :
49- ## LEFT > RIGHT > ROOT
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+
50122 if start :
51123 global NodesBeenMade
52124 NodesBeenMade += 1
53125 trav = self .postorder_tree (start .left , trav )
54126 trav = self .postorder_tree (start .right , trav )
55- trav += (str (start .data ) + "," )
127+ trav += (str (start .value ) + "," )
56128 return trav
129+
57130 def levelorder_tree (self , start ) :
131+
132+ """ Levelorder itrating over tree in the levels
133+
134+ Returns:
135+ levelorder traversal
136+ """
137+
58138 ans = []
59139 if start is None :
60140 return ans
@@ -68,7 +148,7 @@ def levelorder_tree(self , start) :
68148
69149 while currSize > 0 :
70150 currNode = queue .popleft ()
71- currList .append (currNode .data )
151+ currList .append (currNode .value )
72152 currSize -= 1
73153
74154 if currNode .left is not None :
@@ -80,83 +160,56 @@ def levelorder_tree(self , start) :
80160 return ans
81161
82162 def floors_number (self ) :
83- result = tree .PrintTree ("levelorder " )
163+ result = self .PrintTree ("4 " )
84164 return len (result )
85165
86166 def delete_tree (self ) :
87- tree .root = None
167+
168+ """ Delete the tree
169+
170+ Returns :
171+ for deleting
172+ """
173+ self .root = None
88174
89175 def MAX_MIN (self ) :
90- result = tree .PrintTree ("preorder" )
176+
177+ """ Max and Min in the tree :
178+ used a traversal so we can itrate
179+
180+ Returns:
181+ _type_: _description_
182+ """
183+ result = self .PrintTree ("1" )
91184 result = result .split ("," )
92185 result .pop ()
93186 result = [int (x ) for x in result ]
187+
94188 return max (result ),min (result )
95189
96- def find (self , atribute ) :
97- result = tree .PrintTree ("levelorder" )
98- x = 0
99- for i in result :
100- x += 1
101- for j in i :
102- if j == atribute :
103- return x
104- return "Not Found ! "
105-
106- def MakeList (self , type ) -> list :
107- MyList = []
108- result = tree .PrintTree (type )
109- for i in result :
110- if i != "," :
111- MyList .append (int (i ))
112- return MyList
113-
114- def compare (self , type ) :
115- result = tree .MakeList (type )
116- print (result )
117- lst = list (map (int , input ('Enter your tree with desired order : ' ).split ()))
118- return True if result == lst else False
190+ def compare (self ) :
191+ pass
192+
119193
120194 def draw (self ) :
121- result = tree .PrintTree ('levelorder' )
122- result_fixed = []
123- for i in result :
124- for j in i :
125- result_fixed .append (j )
126- drawtree (deserialize (str (result_fixed )))
127-
128- def countLeaves (self ) :
129- result = tree .PrintTree ("levelorder" )
130- return len (result [2 ])
131-
132- """_summary_
133- 2
134- / \
135- 3 4
136- / \
137- 5 6
138- [2]
139- [3.4]
140- [5,6]
141- """
142-
143-
144- # making a test binary tree
145- tree = BinaryTree (2 )
146- tree .root .left = Node (3 )
147- tree .root .right = Node (4 )
148- tree .root .left .left = Node (5 )
149- tree .root .left .right = Node (6 )
150-
151- # trying out the methods
152- print (tree .PrintTree ('preorder' ))
153- print (tree .PrintTree ('inorder' ))
154- print (tree .PrintTree ('postorder' ))
155- print (tree .PrintTree ('levelorder' ))
156- print (tree .floors_number ())
157- print (tree .MAX_MIN ())
158- print (tree .find (7 ))
159- print (tree .draw ())
160- print (tree .countLeaves ())
195+
196+ """ Draw tree
197+
198+ drawing tree using personal module
199+ first we branch our data and then we draw our tree
200+
201+ Returns :
202+ Graphical tree using python's turtle
161203
204+ """
205+ Banching (self .data )
206+ drawtree ()
207+
208+ def numberOfLeafs (self , node : Node ) :
209+ if node is None :
210+ return 0
211+ if (node .left is None and node .right is None ):
212+ return 1
213+ else :
214+ return self .numberOfLeafs (node .left ) + self .numberOfLeafs (node .right )
162215
0 commit comments