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

Commit 2fa911d

Browse files
committed
Made some cool graphical look
1 parent 2f5c4c8 commit 2fa911d

File tree

6 files changed

+306
-105
lines changed

6 files changed

+306
-105
lines changed

.DS_Store

6 KB
Binary file not shown.

Node.py

Lines changed: 143 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,140 @@
11
import collections
2-
from graphical import drawtree , deserialize
3-
2+
from graphical import drawtree , Banching
43
NodesBeenMade = 0
54

65
class 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

1226
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+
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

__pycache__/Node.cpython-310.pyc

5.44 KB
Binary file not shown.

__pycache__/graphical.cpython-310.pyc

13 Bytes
Binary file not shown.

graphical.py

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,33 @@ def __init__(self, val, left=None, right=None):
66
def __repr__(self):
77
return 'TreeNode({})'.format(self.val)
88

9-
def deserialize(string):
10-
if string == '{}':
11-
return None
12-
nodes = [None if val == 'null' else TreeNode(int(val))
13-
for val in string.strip('[]{}').split(',')]
14-
kids = nodes[::-1]
15-
root = kids.pop()
16-
for node in nodes:
17-
if node:
18-
if kids: node.left = kids.pop()
19-
if kids: node.right = kids.pop()
20-
return root
9+
root = None
10+
11+
def Banching(data):
12+
for d in data:
13+
insert(root, d)
14+
15+
def insert(node, value):
16+
global root
17+
if root == None:
18+
root = TreeNode(value)
19+
return
20+
21+
if node.val > value:
22+
if node.left != None:
23+
insert(node.left, value)
24+
else:
25+
node.left = TreeNode(value)
26+
elif node.val < value:
27+
if node.right != None:
28+
insert(node.right, value)
29+
else:
30+
node.right = TreeNode(value)
31+
else:
32+
print("dublicated")
2133

22-
def drawtree(root):
34+
def drawtree():
35+
global root
2336
def height(root):
2437
return 1 + max(height(root.left), height(root.right)) if root else -1
2538
def jumpto(x, y):
@@ -30,7 +43,7 @@ def draw(node, x, y, dx):
3043
if node:
3144
t.goto(x, y)
3245
jumpto(x, y-20)
33-
t.write(node.val, align='center', font=('Arial', 12, 'normal'))
46+
t.write(str(node.val), align='center', font=('Arial', 12, 'normal'))
3447
draw(node.left, x-dx, y-60, dx/2)
3548
jumpto(x, y-20)
3649
draw(node.right, x+dx, y-60, dx/2)
@@ -44,7 +57,8 @@ def draw(node, x, y, dx):
4457
turtle.mainloop()
4558

4659
if __name__ == '__main__':
47-
drawtree(deserialize('[2,3,4,5,6]'))
60+
Banching([2,3,1,4,5])
61+
drawtree()
4862

4963

5064

0 commit comments

Comments
 (0)