class Graph {
adjacencyList: Map<number, number[]>;
constructor() {
this.adjacencyList = new Map();
}
addEdge(u: number, v: number) {
if (!this.adjacencyList.has(u)) this.adjacencyList.set(u, []);
this.adjacencyList.get(u)!.push(v);
}
bfs(start: number): number[] {
const visited = new Set<number>();
const queue: number[] = [];
const order: number[] = [];
visited.add(start); // mark start node as visited
queue.push(start); // enqueue start node
while (queue.length > 0) {
const node = queue.shift()!; // dequeue front node
order.push(node); // record visit order
const neighbors = this.adjacencyList.get(node) || [];
for (const neighbor of neighbors) {
if (!visited.has(neighbor)) {
visited.add(neighbor); // mark neighbor visited when enqueueing
queue.push(neighbor); // enqueue unvisited neighbors
}
}
}
return order;
}
}
// Driver code
const graph = new Graph();
graph.addEdge(1, 2);
graph.addEdge(1, 3);
graph.addEdge(2, 4);
graph.addEdge(3, 5);
const bfsOrder = graph.bfs(1);
console.log(bfsOrder.join(' -> '));visited.add(start); // mark start node as visited
mark start node visited before enqueueing to avoid duplicates
queue.push(start); // enqueue start node
initialize queue with start node to begin BFS
const node = queue.shift()!; // dequeue front node
remove front node from queue to visit it
order.push(node); // record visit order
save node in BFS visit order
const neighbors = this.adjacencyList.get(node) || [];
get neighbors of current node or empty if none
if (!visited.has(neighbor)) { visited.add(neighbor); queue.push(neighbor); }
mark neighbor visited and enqueue unvisited neighbors for future visits