Skip to content

Commit a659896

Browse files
committed
implement bfs and dfs for graphs
1 parent fbb5c79 commit a659896

File tree

2 files changed

+99
-1
lines changed

2 files changed

+99
-1
lines changed

graphs/index.js

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
const { createQueue } = require('../queues')
2+
13
function createNode(key) {
24
const children = []
35

@@ -17,13 +19,16 @@ function createGraph(directed = false) {
1719
return {
1820
directed,
1921
nodes,
22+
edges,
23+
2024
addNode(key) {
2125
nodes.push(createNode(key))
2226
},
27+
2328
getNode(key) {
2429
return nodes.find(n => n.key === key)
2530
},
26-
edges,
31+
2732
addEdge(node1Key, node2Key) {
2833
const node1 = this.getNode(node1Key)
2934
const node2 = this.getNode(node2Key)
@@ -36,6 +41,7 @@ function createGraph(directed = false) {
3641

3742
edges.push(`${node1Key}${node2Key}`)
3843
},
44+
3945
print() {
4046
return nodes
4147
.map(({ children, key }) => {
@@ -48,6 +54,54 @@ function createGraph(directed = false) {
4854
return result
4955
})
5056
.join('\n')
57+
},
58+
59+
bfs(startingNodeKey, visitFn) {
60+
const startingNode = this.getNode(startingNodeKey)
61+
const visitedHash = this.nodes.reduce((acc, cur) => {
62+
acc[cur] = false
63+
return acc
64+
}, {})
65+
const queue = createQueue()
66+
queue.enqueue(startingNode)
67+
68+
while (!queue.isEmpty()) {
69+
const currentNode = queue.dequeue()
70+
71+
if (!visitedHash[currentNode.key]) {
72+
visitFn(currentNode)
73+
visitedHash[currentNode.key] = true
74+
}
75+
76+
currentNode.children.forEach(node => {
77+
if (!visitedHash[node.key]) {
78+
queue.enqueue(node)
79+
}
80+
})
81+
}
82+
},
83+
84+
dfs(startingNodeKey, visitFn) {
85+
const startingNode = this.getNode(startingNodeKey)
86+
const visitedHash = this.nodes.reduce((acc, cur) => {
87+
acc[cur] = false
88+
return acc
89+
}, {})
90+
91+
function explore(node) {
92+
if (visitedHash[node.key]) {
93+
return
94+
}
95+
96+
visitFn(node)
97+
visitedHash[node.key] = true
98+
99+
node.children.forEach(child => {
100+
explore(child)
101+
})
102+
}
103+
104+
explore(startingNode)
51105
}
52106
}
53107
}

graphs/index.test.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,4 +161,48 @@ e`
161161
)
162162
})
163163
})
164+
165+
test('bfs', () => {
166+
const nodes = ['a', 'b', 'c', 'd', 'e']
167+
nodes.forEach(node => {
168+
graph.addNode(node)
169+
})
170+
171+
const edges = [['a', 'b'], ['a', 'c'], ['a', 'e'], ['b', 'd'], ['c', 'd']]
172+
edges.forEach(edge => {
173+
graph.addEdge(...edge)
174+
})
175+
176+
let result = ''
177+
178+
function visit(node) {
179+
result += result.length === 0 ? node.key : ` => ${node.key}`
180+
}
181+
182+
graph.bfs('a', visit)
183+
184+
expect(result).toEqual('a => b => c => e => d')
185+
})
186+
187+
test('dfs', () => {
188+
const nodes = ['a', 'b', 'c', 'd', 'e']
189+
nodes.forEach(node => {
190+
graph.addNode(node)
191+
})
192+
193+
const edges = [['a', 'b'], ['a', 'c'], ['a', 'e'], ['b', 'd'], ['c', 'd']]
194+
edges.forEach(edge => {
195+
graph.addEdge(...edge)
196+
})
197+
198+
let result = ''
199+
200+
function visit(node) {
201+
result += result.length === 0 ? node.key : ` => ${node.key}`
202+
}
203+
204+
graph.dfs('a', visit)
205+
206+
expect(result).toEqual('a => b => d => c => e')
207+
})
164208
})

0 commit comments

Comments
 (0)