Skip to content

Commit dd4759e

Browse files
authored
New Exceptions & Factorial files, and revised bst
1 parent a11689f commit dd4759e

File tree

4 files changed

+291
-0
lines changed

4 files changed

+291
-0
lines changed

bst.py

+236
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,236 @@
1+
# Binary Search Tree in Python
2+
3+
class Node:
4+
def __init__(self, val):
5+
self.value = val
6+
self.leftChild = None
7+
self.rightChild = None
8+
9+
def insert(self, data):
10+
if self.value == data:
11+
return False
12+
13+
elif self.value > data:
14+
if self.leftChild:
15+
return self.leftChild.insert(data)
16+
else:
17+
self.leftChild = Node(data)
18+
return True
19+
20+
else:
21+
if self.rightChild:
22+
return self.rightChild.insert(data)
23+
else:
24+
self.rightChild = Node(data)
25+
return True
26+
27+
def find(self, data):
28+
if(self.value == data):
29+
return True
30+
elif self.value > data:
31+
if self.leftChild:
32+
return self.leftChild.find(data)
33+
else:
34+
return False
35+
else:
36+
if self.rightChild:
37+
return self.rightChild.find(data)
38+
else:
39+
return False
40+
41+
def getSize(self):
42+
if self.leftChild and self.rightChild:
43+
return 1 + self.leftChild.getSize() + self.rightChild.getSize()
44+
elif self.leftChild:
45+
return 1 + self.leftChild.getSize()
46+
elif self.rightChild:
47+
return 1 + self.rightChild.getSize()
48+
else:
49+
return 1
50+
51+
def getHeight(self):
52+
if self.leftChild and self.rightChild:
53+
return 1 + max(self.leftChild.getHeight(), self.rightChild.getHeight())
54+
elif self.leftChild:
55+
return 1 + self.leftChild.getHeight()
56+
elif self.rightChild:
57+
return 1 + self.rightChild.getHeight()
58+
else:
59+
return 1
60+
61+
def preorder(self):
62+
if self:
63+
print (str(self.value))
64+
if self.leftChild:
65+
self.leftChild.preorder()
66+
if self.rightChild:
67+
self.rightChild.preorder()
68+
69+
def postorder(self):
70+
if self:
71+
if self.leftChild:
72+
self.leftChild.postorder()
73+
if self.rightChild:
74+
self.rightChild.postorder()
75+
print (str(self.value))
76+
77+
def inorder(self):
78+
if self:
79+
if self.leftChild:
80+
self.leftChild.inorder()
81+
print (str(self.value))
82+
if self.rightChild:
83+
self.rightChild.inorder()
84+
85+
class Tree:
86+
def __init__(self):
87+
self.root = None
88+
89+
def insert(self, data):
90+
if self.root:
91+
return self.root.insert(data)
92+
else:
93+
self.root = Node(data)
94+
return True
95+
96+
def find(self, data):
97+
if self.root:
98+
return self.root.find(data)
99+
else:
100+
return False
101+
102+
def getHeight(self):
103+
if self.root:
104+
return self.root.getHeight()
105+
else:
106+
return 0
107+
108+
def getSize(self):
109+
if self.root:
110+
return self.root.getSize()
111+
else:
112+
return 0
113+
114+
def remove(self, data):
115+
# empty tree
116+
if self.root is None:
117+
return False
118+
119+
# data is in root node
120+
elif self.root.value == data:
121+
if self.root.leftChild is None and self.root.rightChild is None:
122+
self.root = None
123+
elif self.root.leftChild and self.root.rightChild is None:
124+
self.root = self.root.leftChild
125+
elif self.root.leftChild is None and self.root.rightChild:
126+
self.root = self.root.rightChild
127+
elif self.root.leftChild and self.root.rightChild:
128+
delNodeParent = self.root
129+
delNode = self.root.rightChild
130+
while delNode.leftChild:
131+
delNodeParent = delNode
132+
delNode = delNode.leftChild
133+
134+
self.root.value = delNode.value
135+
if delNode.rightChild:
136+
if delNodeParent.value > delNode.value:
137+
delNodeParent.leftChild = delNode.rightChild
138+
elif delNodeParent.value < delNode.value:
139+
delNodeParent.rightChild = delNode.rightChild
140+
else:
141+
if delNode.value < delNodeParent.value:
142+
delNodeParent.leftChild = None
143+
else:
144+
delNodeParent.rightChild = None
145+
146+
return True
147+
148+
parent = None
149+
node = self.root
150+
151+
# find node to remove
152+
while node and node.value != data:
153+
parent = node
154+
if data < node.value:
155+
node = node.leftChild
156+
elif data > node.value:
157+
node = node.rightChild
158+
159+
# case 1: data not found
160+
if node is None or node.value != data:
161+
return False
162+
163+
# case 2: remove-node has no children
164+
elif node.leftChild is None and node.rightChild is None:
165+
if data < parent.value:
166+
parent.leftChild = None
167+
else:
168+
parent.rightChild = None
169+
return True
170+
171+
# case 3: remove-node has left child only
172+
elif node.leftChild and node.rightChild is None:
173+
if data < parent.value:
174+
parent.leftChild = node.leftChild
175+
else:
176+
parent.rightChild = node.leftChild
177+
return True
178+
179+
# case 4: remove-node has right child only
180+
elif node.leftChild is None and node.rightChild:
181+
if data < parent.value:
182+
parent.leftChild = node.rightChild
183+
else:
184+
parent.rightChild = node.rightChild
185+
return True
186+
187+
# case 5: remove-node has left and right children
188+
else:
189+
delNodeParent = node
190+
delNode = node.rightChild
191+
while delNode.leftChild:
192+
delNodeParent = delNode
193+
delNode = delNode.leftChild
194+
195+
node.value = delNode.value
196+
if delNode.rightChild:
197+
if delNodeParent.value > delNode.value:
198+
delNodeParent.leftChild = delNode.rightChild
199+
elif delNodeParent.value < delNode.value:
200+
delNodeParent.rightChild = delNode.rightChild
201+
else:
202+
if delNode.value < delNodeParent.value:
203+
delNodeParent.leftChild = None
204+
else:
205+
delNodeParent.rightChild = None
206+
207+
def preorder(self):
208+
if self.root is not None:
209+
print("PreOrder")
210+
self.root.preorder()
211+
212+
def postorder(self):
213+
if self.root is not None:
214+
print("PostOrder")
215+
self.root.postorder()
216+
217+
def inorder(self):
218+
if self.root is not None:
219+
print("InOrder")
220+
self.root.inorder()
221+
222+
def main():
223+
bst = Tree()
224+
print(bst.insert(10))
225+
print(bst.insert(5))
226+
bst.insert(2)
227+
bst.insert(7)
228+
bst.preorder()
229+
print('Height = ', bst.getHeight())
230+
print('Size = ', bst.getSize())
231+
#bst.postorder()
232+
#bst.inorder()
233+
print(bst.remove(10))
234+
bst.preorder()
235+
236+
main()

exception-handling.py

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
filename = 'exception_data.txt'
2+
# Outer try block catches file name or file doesn't exist errors.
3+
try:
4+
with open(filename) as fin:
5+
for line in fin:
6+
# print(line)
7+
items = line.split(',')
8+
total = 0
9+
10+
# Inner try bock catches integer conversion errors.
11+
try:
12+
for item in items:
13+
num = int(item)
14+
total += num
15+
print('Total = ' + str(total))
16+
except:
17+
print('Error converting to integer. ', items)
18+
except:
19+
print('Error opening file. ' + filename)
20+
21+
finally:
22+
print('This is our optional finally block. Code here will execute no matter what.')
23+
24+
25+
# Second example: name Error type in except block; call function from try block.
26+
def this_fails():
27+
x = 1/0
28+
try:
29+
this_fails()
30+
except ZeroDivisionError as err:
31+
print('Handling run-time error:', err)

exception_data.txt

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
5,7,28,35,42
2+
2.9,15,4,80,36
3+
16,25,7,11,19
4+
18,15,19,x,10
5+
27,39,12,21,122

factorial.py

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
def get_recursive_factorial(n):
2+
if n < 0:
3+
return -1
4+
elif n < 2:
5+
return 1
6+
else:
7+
return n * get_recursive_factorial(n-1)
8+
9+
def get_iterative_factorial(n):
10+
if n < 0:
11+
return -1
12+
else:
13+
fact = 1
14+
for i in range(1, n+1):
15+
fact *= i
16+
return fact
17+
18+
print(get_recursive_factorial(6))
19+
print(get_iterative_factorial(6))

0 commit comments

Comments
 (0)