Skip to content

Commit bf2fef3

Browse files
committed
Final commit. Book complete.I'm So happygit add *
1 parent c6b5981 commit bf2fef3

File tree

6 files changed

+493
-0
lines changed

6 files changed

+493
-0
lines changed

BST.py

Lines changed: 223 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
class TreeNode:
2+
'''A node for the Binary Search Tree '''
3+
4+
def __init__(self,key,val,left=None,right=None,parent=None):
5+
self.key = key
6+
self.payload = val
7+
self.leftChild = left
8+
self.rightChild = right
9+
self.parent = parent
10+
11+
def hasLeftChild(self):
12+
return self.leftChild
13+
14+
def hasRightChild(self):
15+
return self.rightChild
16+
17+
def isLeftChild(self):
18+
return self.parten and self.parent.leftChild == self
19+
20+
def isRightChild(self):
21+
return self.parent and self.parent.rightChild == self
22+
23+
def isRoot(self):
24+
return not self.parent
25+
26+
def isLeaf(self):
27+
return not (rightChild or self.leftChild)
28+
29+
def hasAnyChildren(self):
30+
return self.rightChild or self.leftChild
31+
32+
def hasBothChildren(self):
33+
return self.rightChild and self.leftChild
34+
35+
def replaceNodeData(self,key,value,lc,rc):
36+
self.key = key
37+
self.payload = value
38+
self.leftChild = lc
39+
self.rightChild = rc
40+
if self.hasLeftChild():
41+
self.leftChild.parent = self
42+
if self.hasRightChild():
43+
self.rightChild.parent = self
44+
45+
def findSuccessor(self):
46+
succ = None
47+
if self.hasRightChild():
48+
succ = self.rightChild.findMin()
49+
else:
50+
if self.parent:
51+
if self.isLeftChild():
52+
succ = self.parent
53+
else:
54+
self.parent.rightChild = None
55+
succ = self.parent.findSuccessor()
56+
self.parent.rightChild =self
57+
return succ
58+
59+
def findMin(self):
60+
current = self
61+
while current.hasLeftChild():
62+
current = current.leftChild
63+
return current
64+
65+
def spliceOut(self):
66+
if self.isLeaf():
67+
if self.isLeftChild():
68+
self.parent.leftChild = None
69+
else:
70+
self.parent.rightChild = None
71+
elif self.hasAnyChildren():
72+
if self.hasLeftChild():
73+
if self.isLeftChild():
74+
self.parent.leftChild = self.leftChild
75+
else:
76+
self.parent.rightChild = self.leftChild
77+
self.leftChild.parent = self.parent
78+
else:
79+
if self.isLeftChild():
80+
self.parent.rightChild = self.rightChild
81+
else:
82+
self.parent.rightChild = self.rightChild
83+
self.rightChild.parent = self.parent
84+
def __iter__(self):
85+
if self:
86+
if self.hasLeftChild():
87+
for elem in self.leftChild:
88+
yield elem
89+
yield self.key
90+
if self.hasRightChild():
91+
for elm in self.rightChild:
92+
yield elem
93+
94+
class BinarySearchTree:
95+
96+
def __init__(self):
97+
self.root = None
98+
self.size = 0
99+
100+
def length(self):
101+
return self.size
102+
103+
def __len__(self):
104+
return self.size
105+
106+
def __iter__(self):
107+
return self.root.__iter__()
108+
109+
def put(self,key,val):
110+
if self.root:
111+
self._put(key,val,self.root)
112+
else:
113+
self.root = TreeNode(key,val)
114+
self.size = self.size + 1
115+
116+
def _put(self,key,val,currentNode):
117+
if key < currentNode.key:
118+
if currentNode.hasLeftChild():
119+
self._put(key,val,currentNode.leftChild)
120+
else:
121+
currentNode.leftChild = TreeNode(key,val,parent=currentNode)
122+
elif key == currentNode.key:
123+
currentNode.payload = val
124+
else:
125+
if currentNode.hasRightChild():
126+
self._put(key,val,currentNode.rightChild)
127+
else:
128+
currentNode.rightChild = TreeNode(key,val,parent=currentNode)
129+
130+
def __setitem__(self,k,v):
131+
self.put(k,v)
132+
133+
def get(self,key):
134+
if self.root:
135+
res = self._get(key,self.root)
136+
if res:
137+
return res.payload
138+
else:
139+
return None
140+
else:
141+
return None
142+
143+
def _get(self,key,currentNode):
144+
if not currentNode:
145+
return None
146+
elif currentNode.key == key:
147+
return currentNode
148+
elif key < currentNode.key:
149+
return self._get(key,currentNode.leftChild)
150+
else:
151+
return self._get(key,currentNode.rightChild)
152+
153+
def __getitem__(self,key):
154+
return self.get(key)
155+
156+
def __contains__(self,key):
157+
if self._get(key,self.root):
158+
return True
159+
else:
160+
return False
161+
162+
def delete(self,key):
163+
if self.size > 1:
164+
nodeToRemove = self._get(key,self.root)
165+
if nodeToRemove:
166+
self.remove(nodeToRemove)
167+
self.size = self.size-1
168+
else:
169+
raise KeyError('Error, key not in tree')
170+
elif self.size == 1 and self.root.key == key:
171+
self.root = None
172+
self.size = self.size - 1
173+
else:
174+
raise KeyError('Error, key not in tree')
175+
176+
def __delitem__(self,key):
177+
self.delete(key)
178+
179+
def remove(self,currentNode):
180+
if currentNode.isLeaf(): #leaf
181+
if currentNode == currentNode.parent.leftChild:
182+
currentNode.parent.leftChild = None
183+
else:
184+
currentNode.parent.rightChild= None
185+
elif currentNode.hasBothChildren(): #interior
186+
succ = currentNode.findSuccessor()
187+
succ.spliceOut()
188+
currentNode.key = succ.key
189+
currentNode.payload = succ.payload
190+
else: #this node has one child
191+
if currentNode.hasLeftChild():
192+
if currentNode.isLeftChild():
193+
currentNode.leftChild.parent = currentNode.parent
194+
currentNode.parent.leftChild = currentNode.leftChild
195+
elif currentNode.isRightChild():
196+
currentNode.leftChild.parent = currentNode.parent
197+
currentNode.parent.rightChild = currentNode.leftChild
198+
else:
199+
currentNode.replaceNodeData(currentNode.leftChild.key,
200+
currentNode.leftChild.payload,
201+
currentNode.leftChild.leftChild,
202+
currentNode.leftChild.rightChild)
203+
else:
204+
if currentNode.isLeftChild():
205+
currentNode.rightChild.parent = currentNode.parent
206+
currentNode.parent.leftChild = currentNode.rightChild
207+
elif currentNode.isRightChild():
208+
currentNode.rightChild.parent = currentNode.parent
209+
currentNode.parent.rightChild = currentNode.rightChild
210+
else:
211+
currentNode.replaceNodeData(currentNode.rightChild.key,
212+
currentNode.rightChild.payload,
213+
currentNode.rightChild.leftChild,
214+
currentNode.rightChild.rightChild)
215+
216+
mytree = BinarySearchTree()
217+
mytree[3]="red"
218+
mytree[4]="blue"
219+
mytree[6]="yellow"
220+
mytree[2]="at"
221+
222+
print(mytree[6])
223+
print(mytree[2])

BinaryHeap.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
class BinHeap:
2+
def __init__(self):
3+
self.heap_list = [0]
4+
self.current_size = 0
5+
6+
def perc_up(self, i):
7+
while i//2 > 0:
8+
if self.heap_list[i] < self.heap_list [i //2]:
9+
tmp = self.heap_list[i // 2]
10+
self.heap_list[i // 2] = self.heap_list[i]
11+
self.heap_list[i] = tmp
12+
i = i // 2
13+
14+
def insert(self, k):
15+
self.heap_list.append(k)
16+
self.current_size += 1
17+
self.perc_up(self.current_size)
18+
19+
def perc_down(self, i):
20+
while (i * 2) <= self.current_size:
21+
mc = self.min_child(i)
22+
if self.heap_list[i] > self.heap_list[mc]:
23+
tmp = self.heap_list[i]
24+
self.heap_list[i] = self.heap_list[mc]
25+
self.heap_list[mc] = tmp
26+
i = mc
27+
28+
def min_child(self, i):
29+
if (i * 2 + 1) > self.current_size:
30+
return i* 2
31+
else:
32+
if self.heap_list[i * 2] < self.heap_list[i * 2 + 1]:
33+
return i * 2
34+
else:
35+
return i * 2 + 1
36+
37+
def del_min(self):
38+
ret_val = self.heap_list[1]
39+
self.heap_list[1] = self.heap_list[self.current_size]
40+
self.current_size -= 1
41+
self.heap_list.pop()
42+
self.perc_down(1)
43+
return ret_val
44+
45+
def build_heap(self, a_list):
46+
i = len(a_list) // 2
47+
self.current_size = len(a_list)
48+
self.heap_list = [0] + a_list[:]
49+
while (i > 0):
50+
self.perc_down(i)
51+
i -= 1
52+
53+
heap = BinHeap()
54+
heap.build_heap([9, 6, 5, 2, 3])
55+
#heap.insert(5)
56+
#heap.insert(3)
57+
#heap.insert(9)
58+
#heap.perc_down()
59+
print("done")

BinaryTree_UsingListofLists.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
def binary_tree(n):
2+
return [n,[],[]]
3+
4+
def insert_left(root,new_value):
5+
t = root.pop(1)
6+
if len(t) > 1:
7+
root.insert(1,[new_value,t,[]])
8+
else:
9+
root.insert(1,[new_value,[],[]])
10+
return root
11+
12+
def insert_right(root,new_value):
13+
t = root.pop(2)
14+
if len(t) > 1:
15+
root.insert(2,[new_value,[],t])
16+
else:
17+
root.insert(2,[new_value,[],[]])
18+
return root
19+
20+
def get_root_val(root):
21+
return root[0]
22+
23+
def set_root_val(root, new_val):
24+
root[0] = new_val
25+
26+
def get_left_child(root):
27+
return root[1]
28+
29+
def get_right_child(root):
30+
return root[2]
31+
32+
def build_tree():
33+
x = binary_tree('a')
34+
insert_left(x,'b')
35+
insert_right(x,'c')
36+
insert_right(get_left_child(x),'d')
37+
insert_left(get_right_child(x),'e')
38+
insert_right(get_right_child(x),'f')
39+
return x
40+
41+
print(build_tree())
42+
"""
43+
x = binary_tree('a')
44+
insert_left(x,'b')
45+
insert_right(x,'c')
46+
print x
47+
insert_right(get_right_child(x), 'd')
48+
print x
49+
insert_left(get_right_child(get_right_child(x)), 'e')
50+
print x
51+
52+
# another tree
53+
r = binary_tree(3)
54+
print(r)
55+
insert_left(r, 4)
56+
insert_left(r, 5)
57+
insert_right(r, 6)
58+
insert_right(r, 7)
59+
print(r)
60+
l = get_left_child(r)
61+
print(l)
62+
set_root_val(l, 9)
63+
print(r)
64+
insert_left(l, 11)
65+
print(r)
66+
print(get_right_child(get_right_child(r)))"""

0 commit comments

Comments
 (0)