Skip to content
This repository was archived by the owner on Feb 3, 2025. It is now read-only.

Commit 35f7b76

Browse files
committed
added python package
1 parent e941a95 commit 35f7b76

13 files changed

+1309
-8
lines changed

.DS_Store

0 Bytes
Binary file not shown.

BinaryTrees/Node.py

+301
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,301 @@
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)

BinaryTrees/__init__.py

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
import BinaryTrees, Node
2+
import Node

0 commit comments

Comments
 (0)