# CSPT25 Lecture 13
```
from collections import deque
class Graph:
def __init__(self):
self.adjList = {}
def __repr__(self):
return str(self.adjList)
def addEdge(self, source, destination):
if source not in self.adjList or destination not in self.adjList:
return
self.adjList[source].add(destination)
def removeEdge(self, source, destination):
if source not in self.adjList or destination not in self.adjList:
return
try:
self.adjList[source].remove(destination)
except:
pass
def edgeExists(self, source, destination):
return destination in self.adjList[source]
def addVertex(self, value):
if value in self.adjList:
return
self.adjList[value] = set()
def removeVertex(self, vertexToRemove):
if vertexToRemove not in self.adjList:
return
self.adjList.pop(vertexToRemove)
for (vertex, neighbors) in self.adjList.items():
if vertexToRemove in neighbors:
neighbors.remove(vertexToRemove)
def dftIterative(self, startingNode):
stack = deque()
stack.append(startingNode)
visited = set()
res = []
while len(stack) > 0:
curr = stack.pop()
if curr not in visited:
visited.add(curr)
res.append(curr)
for neighbor in self.adjList[curr]:
stack.append(neighbor)
return res
def dftRecursive(self, startingNode):
visited = set()
res = []
self.dftRecursiveHelper(startingNode, visited, res)
return res
def dftRecursiveHelper(self, currNode, visited, res):
visited.add(currNode)
res.append(currNode)
for neighbor in self.adjList[currNode]:
if neighbor not in visited:
self.dftRecursiveHelper(neighbor, visited, res)
def bftIterative(self, startingNode):
queue = deque()
queue.append(startingNode)
visited = set()
res = []
while len(queue) > 0:
curr = queue.popleft()
if curr not in visited:
visited.add(curr)
res.append(curr)
for neighbor in self.adjList[curr]:
queue.append(neighbor)
return res
g = Graph()
g.addVertex(1)
g.addVertex(2)
g.addVertex(3)
g.addVertex(4)
g.addEdge(1, 2)
g.addEdge(1, 3)
g.addEdge(2, 4)
g.addEdge(3, 4)
g.addEdge(4, 1)
print(g.bftIterative(1))
```