1
1
import collections
2
- from graphical import drawtree , deserialize
3
-
2
+ from graphical import drawtree , Banching
4
3
NodesBeenMade = 0
5
4
6
5
class Node :
7
6
def __init__ (self , data ) :
8
7
self .left = None
9
8
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
+
11
25
12
26
class 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
+
15
62
16
63
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 )
25
79
else :
26
- return False
80
+ print ( "Invalid input !" )
27
81
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
+
30
90
if start :
31
91
global NodesBeenMade
32
92
NodesBeenMade += 1
33
- trav += (str (start .data ) + "," )
93
+ trav += (str (start .value ) + "," )
34
94
trav = self .preorder_tree (start .left , trav )
35
95
trav = self .preorder_tree (start .right , trav )
36
96
return trav
37
97
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
+
40
106
if start :
41
107
global NodesBeenMade
42
108
NodesBeenMade += 1
43
109
trav = self .inorder_tree (start .left , trav )
44
- trav += (str (start .data ) + "," )
110
+ trav += (str (start .value ) + "," )
45
111
trav = self .inorder_tree (start .right , trav )
46
112
return trav
47
113
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
+
50
122
if start :
51
123
global NodesBeenMade
52
124
NodesBeenMade += 1
53
125
trav = self .postorder_tree (start .left , trav )
54
126
trav = self .postorder_tree (start .right , trav )
55
- trav += (str (start .data ) + "," )
127
+ trav += (str (start .value ) + "," )
56
128
return trav
129
+
57
130
def levelorder_tree (self , start ) :
131
+
132
+ """ Levelorder itrating over tree in the levels
133
+
134
+ Returns:
135
+ levelorder traversal
136
+ """
137
+
58
138
ans = []
59
139
if start is None :
60
140
return ans
@@ -68,7 +148,7 @@ def levelorder_tree(self , start) :
68
148
69
149
while currSize > 0 :
70
150
currNode = queue .popleft ()
71
- currList .append (currNode .data )
151
+ currList .append (currNode .value )
72
152
currSize -= 1
73
153
74
154
if currNode .left is not None :
@@ -80,83 +160,56 @@ def levelorder_tree(self , start) :
80
160
return ans
81
161
82
162
def floors_number (self ) :
83
- result = tree .PrintTree ("levelorder " )
163
+ result = self .PrintTree ("4 " )
84
164
return len (result )
85
165
86
166
def delete_tree (self ) :
87
- tree .root = None
167
+
168
+ """ Delete the tree
169
+
170
+ Returns :
171
+ for deleting
172
+ """
173
+ self .root = None
88
174
89
175
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" )
91
184
result = result .split ("," )
92
185
result .pop ()
93
186
result = [int (x ) for x in result ]
187
+
94
188
return max (result ),min (result )
95
189
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
+
119
193
120
194
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
161
203
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 )
162
215
0 commit comments