Skip to content

Commit b2f1d88

Browse files
committed
first commit
1 parent 6acf273 commit b2f1d88

15 files changed

+852
-0
lines changed

data_structures/binary_tree.py

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
class Node:
2+
def __init__(self, value):
3+
self.value = value
4+
self.left = None
5+
self.right = None
6+
7+
8+
class BinarySearchTree:
9+
def __init__(self):
10+
self.root = None
11+
12+
def insert(self, value):
13+
new_node = Node(value)
14+
if self.root is None:
15+
self.root = new_node
16+
return True
17+
temp = self.root
18+
while (True):
19+
if new_node.value == temp.value:
20+
return False
21+
if new_node.value < temp.value:
22+
if temp.left is None:
23+
temp.left = new_node
24+
return True
25+
temp = temp.left
26+
else:
27+
if temp.right is None:
28+
temp.right = new_node
29+
return True
30+
temp = temp.right
31+
32+
def contains(self, value):
33+
# if self.root is None:
34+
# return False
35+
temp = self.root
36+
while (temp is not None):
37+
if value < temp.value:
38+
temp = temp.left
39+
elif value > temp.value:
40+
temp = temp.right
41+
else:
42+
return True
43+
return False
44+
45+
46+
my_tree = BinarySearchTree()
47+
my_tree.insert(2)
48+
my_tree.insert(1)
49+
my_tree.insert(3)
50+
my_tree.insert(200)
51+
my_tree.insert(4)
52+
my_tree.insert(8)
53+
my_tree.insert(100)
54+
55+
print(my_tree.root.value)
56+
print(my_tree.root.left.value)
57+
print(my_tree.root.right.value)
58+
# print(my_tree.root.right.left.value)
59+
print(my_tree.root.right.right.value)
60+
61+
print(my_tree.contains(200))

data_structures/doubly_linked_list.py

+151
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
class Node:
2+
def __init__(self, value):
3+
self.value = value
4+
self.next = None
5+
self.prev = None
6+
7+
8+
class DoublyLinkedList:
9+
def __init__(self, value):
10+
new_node = Node(value)
11+
self.head = new_node
12+
self.tail = new_node
13+
self.length = 1
14+
15+
def print_list(self):
16+
full_list = []
17+
temp = self.head
18+
while temp is not None:
19+
print(temp.value)
20+
# full_list.append(temp.value)
21+
temp = temp.next
22+
# print(full_list)
23+
24+
def append(self, value):
25+
new_node = Node(value)
26+
if self.head is None:
27+
self.head = new_node
28+
self.tail = new_node
29+
else:
30+
self.tail.next = new_node
31+
new_node.prev = self.tail
32+
self.tail = new_node
33+
self.length += 1
34+
return True
35+
36+
def pop(self):
37+
if self.length == 0:
38+
return None
39+
temp = self.tail
40+
if self.length == 1:
41+
self.head = None
42+
self.tail = None
43+
else:
44+
self.tail = self.tail.prev
45+
self.tail.next = None
46+
temp.prev = None
47+
self.length -= 1
48+
return temp
49+
50+
def prepend(self, value):
51+
new_node = Node(value)
52+
if self.length == 0:
53+
self.head = new_node
54+
self.tail = new_node
55+
return new_node
56+
else:
57+
new_node.next = self.head
58+
self.head.prev = new_node
59+
self.head = new_node
60+
self.length += 1
61+
return True
62+
63+
def pop_first(self):
64+
if self.length == 0:
65+
return None
66+
temp = self.head
67+
if self.length == 1:
68+
self.head = None
69+
self.tail = None
70+
else:
71+
self.head = self.head.next
72+
self.head.prev = None
73+
temp.next = None
74+
self.length -= 1
75+
return temp
76+
77+
def get(self, index):
78+
if index < 0 or index >= self.length:
79+
return None
80+
temp = self.head
81+
if index < self.length / 2:
82+
for _ in range(index):
83+
temp = temp.next
84+
else:
85+
temp = self.tail
86+
for _ in range(self.length - 1, index, -1):
87+
temp = temp.prev
88+
return temp
89+
90+
def set_value(self, index, value):
91+
temp = self.get(index)
92+
if temp:
93+
temp.value = value
94+
return True
95+
return False
96+
97+
def insert(self, index, value):
98+
if index < 0 or index > self.length:
99+
return False
100+
if index == 0:
101+
return self.prepend(value)
102+
if index == self.length:
103+
return self.append(value)
104+
105+
new_node = Node(value)
106+
before = self.get(index - 1)
107+
after = before.next
108+
109+
new_node.prev = before
110+
new_node.next = after
111+
before.next = new_node
112+
after.prev = new_node
113+
self.length += 1
114+
return True
115+
116+
def remove(self, index):
117+
if index < 0 or index >= self.length:
118+
return None
119+
if index == 0:
120+
return self.pop_first()
121+
if index == self.length - 1:
122+
return self.pop()
123+
124+
temp = self.get(index)
125+
temp.next.prev = temp.prev
126+
temp.prev.next = temp.next
127+
# Same code
128+
# before = temp.prev
129+
# after = temp.next
130+
# before.next = after
131+
# after.prev = before
132+
# Same code
133+
temp.next = None
134+
temp.prev = None
135+
self.length -= 1
136+
return temp
137+
138+
139+
my_doubly_linked_list = DoublyLinkedList(2)
140+
my_doubly_linked_list.append(3)
141+
my_doubly_linked_list.append(4)
142+
my_doubly_linked_list.print_list()
143+
144+
my_doubly_linked_list.pop()
145+
146+
my_doubly_linked_list.prepend(1)
147+
print(my_doubly_linked_list.get(1))
148+
my_doubly_linked_list.insert(1, 100)
149+
my_doubly_linked_list.remove(1)
150+
print("Final list:")
151+
my_doubly_linked_list.print_list()

data_structures/graph.py

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
class Graph:
2+
def __init__(self):
3+
self.adj_list = {}
4+
5+
def print_graph(self):
6+
for vertex in self.adj_list:
7+
print(vertex, ": ", self.adj_list[vertex])
8+
9+
def add_vertex(self, vertex):
10+
if vertex not in self.adj_list.keys():
11+
self.adj_list[vertex] = []
12+
return True
13+
return False
14+
15+
def add_edge(self, v1, v2):
16+
if v1 in self.adj_list.keys() and v2 in self.adj_list.keys():
17+
self.adj_list[v1].append(v2)
18+
self.adj_list[v2].append(v1)
19+
return True
20+
return False
21+
22+
def remove_edge(self, v1, v2):
23+
if v1 in self.adj_list.keys() and v2 in self.adj_list.keys():
24+
try:
25+
self.adj_list[v1].remove(v2)
26+
self.adj_list[v2].remove(v1)
27+
except ValueError:
28+
pass
29+
return True
30+
31+
return False
32+
33+
def remove_vertex(self, vertex):
34+
if vertex in self.adj_list.keys():
35+
for other_vertex in self.adj_list[vertex]:
36+
self.adj_list[other_vertex].remove(vertex)
37+
del self.adj_list[vertex]
38+
return True
39+
return False
40+
41+
42+
my_graph = Graph()
43+
44+
my_graph.add_vertex("A")
45+
my_graph.add_vertex("B")
46+
my_graph.add_vertex("C")
47+
my_graph.add_vertex("D")
48+
49+
my_graph.add_edge("A", "B")
50+
my_graph.add_edge("A", "C")
51+
my_graph.add_edge("A", "D")
52+
my_graph.add_edge("B", "D")
53+
my_graph.add_edge("C", "D")
54+
55+
my_graph.print_graph()
56+
57+
my_graph.remove_vertex("D")
58+
my_graph.print_graph()
59+
# my_graph.remove_edge("A", "C")
60+
# my_graph.remove_edge("A", "D")
61+
# my_graph.print_graph()

data_structures/hash_map.py

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
class HashTable:
2+
def __init__(self, size=7):
3+
self.data_map = [None] * size
4+
5+
def print_table(self):
6+
for i, val in enumerate(self.data_map):
7+
print(i, ": ", val)
8+
9+
def __hash(self, key):
10+
my_hash = 0
11+
for letter in key:
12+
# ord = ordinal, gets the ASCII for each letter
13+
# multiply it by 23 (23 is a primer number, can be any number)
14+
# % modular = gives us remainer
15+
my_hash = (my_hash + ord(letter) * 23) % len(self.data_map)
16+
return my_hash
17+
18+
def set_item(self, key, value):
19+
index = self.__hash(key)
20+
if self.data_map[index] == None:
21+
self.data_map[index] = []
22+
self.data_map[index].append([key, value])
23+
24+
def get_item(self, key):
25+
index = self.__hash(key)
26+
if self.data_map[index] is not None:
27+
for i in range(len(self.data_map[index])):
28+
if self.data_map[index][i][0] == key:
29+
return self.data_map[index][i][1]
30+
return None
31+
32+
def keys(self):
33+
all_keys = []
34+
for i in range(len(self.data_map)):
35+
if self.data_map[i] is not None:
36+
for j in range(len(self.data_map[i])):
37+
all_keys.append(self.data_map[i][j][0])
38+
return all_keys
39+
40+
41+
my_hash_table = HashTable()
42+
43+
my_hash_table.set_item('bolts', 1400)
44+
my_hash_table.set_item('washers', 50)
45+
my_hash_table.set_item('lumber', 70)
46+
47+
print(my_hash_table.get_item("bolts"))
48+
49+
print(my_hash_table.keys())
50+
my_hash_table.print_table()

0 commit comments

Comments
 (0)