Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit bf2fef3

Browse files
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)

AltStyle によって変換されたページ (->オリジナル) /