ADS & AA LAB - 2,3,4,5 Programs
ADS & AA LAB - 2,3,4,5 Programs
import random
class BTreeNode:
def __init__(self, leaf=False):
self.leaf = leaf
self.keys = []
self.children = []
class BTree:
def __init__(self, t):
self.root = BTreeNode(True)
self.t = t # Minimum degree
if len(x.children[i].keys) >= t:
x.keys[i] = self._delete_predecessor(x.children[i])
return
elif len(x.children[i + 1].keys) >= t:
x.keys[i] = self._delete_successor(x.children[i + 1])
return
else:
self._delete_merge(x, i, i + 1)
self._delete_internal_node(x.children[i], k, self.t - 1)
# Example usage
print("Random elements:", random_elements)
print("Searching for 42:", b_tree.search(42))
print("Inserting 42")
b_tree.insert(42)
print("Searching for 42:", b_tree.search(42))
print("Deleting 42")
b_tree.delete(42)
print("Searching for 42:", b_tree.search(42))
output:
Random elements: [245, 678, 123, 901, 456, 789, 234, 567, 890, 345, 678, 912, 543, 876,
109, ...]
Searching for 42: None
Inserting 42
Searching for 42: (<__main__.BTreeNode object at 0x...>, 0)
Deleting 42
Searching for 42: None
2 ) Construct Min and Max Heap using arrays, delete any element and display the content of
the Heap
class Heap:
def __init__(self, heap_type="min"):
self.heap = []
self.heap_type = heap_type
if largest != i:
self.swap(i, largest)
self.heapify(largest)
index = self.heap.index(key)
self.swap(index, len(self.heap) - 1)
self.heap.pop()
def display(self):
print(f"{self.heap_type.capitalize()} Heap:", self.heap)
# Example usage
if __name__ == "__main__":
# Min Heap
min_heap = Heap("min")
for item in [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]:
min_heap.insert(item)
# Max Heap
max_heap = Heap("max")
for item in [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]:
max_heap.insert(item)
print("\nInitial Max Heap:")
max_heap.display()
class Graph:
def __init__(self, vertices):
self.V = vertices
self.adj_matrix = [[0 for _ in range(vertices)] for _ in range(vertices)]
self.adj_list = [[] for _ in range(vertices)]
while queue:
vertex = queue.popleft()
result.append(vertex)
for i in range(self.V):
if self.adj_matrix[vertex][i] == 1 and not visited[i]:
queue.append(i)
visited[i] = True
return result
while stack:
vertex = stack.pop()
if not visited[vertex]:
visited[vertex] = True
result.append(vertex)
return result
while queue:
vertex = queue.popleft()
result.append(vertex)
return result
while stack:
vertex = stack.pop()
if not visited[vertex]:
visited[vertex] = True
result.append(vertex)
return result
# Example usage
if __name__ == "__main__":
g = Graph(6)
g.add_edge(0, 1)
g.add_edge(0, 2)
g.add_edge(1, 3)
g.add_edge(2, 3)
g.add_edge(2, 4)
g.add_edge(3, 4)
g.add_edge(3, 5)
g.add_edge(4, 5)
print("Adjacency Matrix:")
for row in g.adj_matrix:
print(row)
print("\nAdjacency List:")
for i, neighbors in enumerate(g.adj_list):
print(f"{i}: {neighbors}")
Adjacency List:
0: [1, 2]
1: [0, 3]
2: [0, 3, 4]
3: [1, 2, 4, 5]
4: [2, 3, 5]
5: [3, 4]
if (parent != -1 and low[v] >= disc[u]) or (parent == -1 and children > 1):
ap[u] = True
component = []
while st[-1] != (u, v):
component.append(st.pop())
component.append(st.pop())
self.biconnected_components.append(component)
def find_biconnected_components(self):
disc = [-1] * self.V
low = [-1] * self.V
parent = [-1] * self.V
ap = [False] * self.V
st = []
for i in range(self.V):
if disc[i] == -1:
self.biconnected_components_util(i, -1, low, disc, st, ap)
if st:
component = []
while st:
component.append(st.pop())
self.biconnected_components.append(component)
def print_biconnected_components(self):
print("Biconnected components in the graph:")
for i, component in enumerate(self.biconnected_components, 1):
print(f"Component {i}:", component)
# Example usage
if __name__ == "__main__":
g = Graph(5)
g.add_edge(1, 0)
g.add_edge(0, 2)
g.add_edge(2, 1)
g.add_edge(0, 3)
g.add_edge(3, 4)
g.find_biconnected_components()
g.print_biconnected_components()
output:
Biconnected components in the graph:
Component 1: [(3, 4)]
Component 2: [(0, 3)]
Component 3: [(1, 0), (0, 2), (2, 1)]