Skip to content

Commit aa8e352

Browse files
author
Chris Pilcher
committed
BFS Changed simple example to return array instead of printing explored nodes to allow for testing. Added tests for simple example.
1 parent 32ac84b commit aa8e352

File tree

4 files changed

+105
-14
lines changed

4 files changed

+105
-14
lines changed

Breadth-First Search/BreadthFirstSearch.playground/Pages/Simple example.xcplaygroundpage/Contents.swift

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
func breadthFirstSearch(graph: Graph, source: Node) {
1+
func breadthFirstSearch(graph: Graph, source: Node) -> [String] {
22
var queue = Queue<Node>()
33
queue.enqueue(source)
44

5-
print(source.label)
5+
var nodesExplored = [source.label]
6+
source.visited = true
67

78
while !queue.isEmpty {
89
let current = queue.dequeue()!
@@ -11,10 +12,13 @@ func breadthFirstSearch(graph: Graph, source: Node) {
1112
if !neighborNode.visited {
1213
queue.enqueue(neighborNode)
1314
neighborNode.visited = true
14-
print(neighborNode.label)
15+
16+
nodesExplored.append(neighborNode.label)
1517
}
1618
}
1719
}
20+
21+
return nodesExplored
1822
}
1923

2024
/*:
@@ -41,4 +45,5 @@ graph.addEdge(nodeC, neighbor: nodeG)
4145
graph.addEdge(nodeE, neighbor: nodeH)
4246

4347

44-
breadthFirstSearch(graph, source: nodeA)
48+
let nodesExplored = breadthFirstSearch(graph, source: nodeA)
49+
print(nodesExplored)
Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,22 @@
1-
func breadthFirstSearch(graph: Graph, source: Node) {
1+
func breadthFirstSearch(graph: Graph, source: Node) -> [String] {
22
var queue = Queue<Node>()
33
queue.enqueue(source)
44

5-
print(source.label)
6-
5+
var nodesExplored = [source.label]
6+
source.visited = true
7+
78
while !queue.isEmpty {
89
let current = queue.dequeue()!
910
for edge in current.neighbors {
1011
let neighborNode = edge.neighbor
1112
if !neighborNode.visited {
1213
queue.enqueue(neighborNode)
1314
neighborNode.visited = true
14-
print(neighborNode.label)
15+
16+
nodesExplored.append(neighborNode.label)
1517
}
1618
}
1719
}
20+
21+
return nodesExplored
1822
}

Breadth-First Search/README.markdown

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,12 @@ The queue is now empty which means all nodes have been explored.
5858
Simple implementation of breadth-first search using a queue:
5959

6060
```swift
61-
func breadthFirstSearch(graph: Graph, source: Node) {
61+
func breadthFirstSearch(graph: Graph, source: Node) -> [String] {
6262
var queue = Queue<Node>()
6363
queue.enqueue(source)
6464

65-
print(source.label)
65+
var nodesExplored = [source.label]
66+
source.visited = true
6667

6768
while !queue.isEmpty {
6869
let current = queue.dequeue()!
@@ -71,10 +72,13 @@ func breadthFirstSearch(graph: Graph, source: Node) {
7172
if !neighborNode.visited {
7273
queue.enqueue(neighborNode)
7374
neighborNode.visited = true
74-
print(neighborNode.label)
75+
76+
nodesExplored.append(neighborNode.label)
7577
}
7678
}
7779
}
80+
81+
return nodesExplored
7882
}
7983
```
8084

@@ -99,7 +103,8 @@ graph.addEdge(nodeC, neighbor: nodeF)
99103
graph.addEdge(nodeC, neighbor: nodeG)
100104
graph.addEdge(nodeE, neighbor: nodeH)
101105

102-
breadthFirstSearch(graph, source: nodeA) // This will output: a, b, c, d, e, f, g, h
106+
let nodesExplored = breadthFirstSearch(graph, source: nodeA)
107+
print(nodesExplored) // This will output: ["a", "b", "c", "d", "e", "f", "g", "h"]
103108
```
104109

105110
## Applications

Breadth-First Search/Tests/BreadthFirstSearchTests.swift

Lines changed: 79 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,84 @@ import Foundation
22
import XCTest
33

44
class QueueTest: XCTestCase {
5-
func testFail() {
6-
XCTAssertFalse(true)
5+
6+
func testExploringTree() {
7+
let tree = Graph()
8+
let nodeA = tree.addNode("a")
9+
let nodeB = tree.addNode("b")
10+
let nodeC = tree.addNode("c")
11+
let nodeD = tree.addNode("d")
12+
let nodeE = tree.addNode("e")
13+
let nodeF = tree.addNode("f")
14+
let nodeG = tree.addNode("g")
15+
let nodeH = tree.addNode("h")
16+
tree.addEdge(nodeA, neighbor: nodeB)
17+
tree.addEdge(nodeA, neighbor: nodeC)
18+
tree.addEdge(nodeB, neighbor: nodeD)
19+
tree.addEdge(nodeB, neighbor: nodeE)
20+
tree.addEdge(nodeC, neighbor: nodeF)
21+
tree.addEdge(nodeC, neighbor: nodeG)
22+
tree.addEdge(nodeE, neighbor: nodeH)
23+
24+
let nodesExplored = breadthFirstSearch(tree, source: nodeA)
25+
26+
XCTAssertEqual(nodesExplored, ["a", "b", "c", "d", "e", "f", "g", "h"])
27+
}
28+
29+
func testExploringGraph() {
30+
let graph = Graph()
31+
32+
let nodeA = graph.addNode("a")
33+
let nodeB = graph.addNode("b")
34+
let nodeC = graph.addNode("c")
35+
let nodeD = graph.addNode("d")
36+
let nodeE = graph.addNode("e")
37+
let nodeF = graph.addNode("f")
38+
let nodeG = graph.addNode("g")
39+
let nodeH = graph.addNode("h")
40+
let nodeI = graph.addNode("i")
41+
42+
graph.addEdge(nodeA, neighbor: nodeB)
43+
graph.addEdge(nodeA, neighbor: nodeH)
44+
graph.addEdge(nodeB, neighbor: nodeA)
45+
graph.addEdge(nodeB, neighbor: nodeC)
46+
graph.addEdge(nodeB, neighbor: nodeH)
47+
graph.addEdge(nodeC, neighbor: nodeB)
48+
graph.addEdge(nodeC, neighbor: nodeD)
49+
graph.addEdge(nodeC, neighbor: nodeF)
50+
graph.addEdge(nodeC, neighbor: nodeI)
51+
graph.addEdge(nodeD, neighbor: nodeC)
52+
graph.addEdge(nodeD, neighbor: nodeE)
53+
graph.addEdge(nodeD, neighbor: nodeF)
54+
graph.addEdge(nodeE, neighbor: nodeD)
55+
graph.addEdge(nodeE, neighbor: nodeF)
56+
graph.addEdge(nodeF, neighbor: nodeC)
57+
graph.addEdge(nodeF, neighbor: nodeD)
58+
graph.addEdge(nodeF, neighbor: nodeE)
59+
graph.addEdge(nodeF, neighbor: nodeG)
60+
graph.addEdge(nodeG, neighbor: nodeF)
61+
graph.addEdge(nodeG, neighbor: nodeH)
62+
graph.addEdge(nodeG, neighbor: nodeI)
63+
graph.addEdge(nodeH, neighbor: nodeA)
64+
graph.addEdge(nodeH, neighbor: nodeB)
65+
graph.addEdge(nodeH, neighbor: nodeG)
66+
graph.addEdge(nodeH, neighbor: nodeI)
67+
graph.addEdge(nodeI, neighbor: nodeC)
68+
graph.addEdge(nodeI, neighbor: nodeG)
69+
graph.addEdge(nodeI, neighbor: nodeH)
70+
71+
let nodesExplored = breadthFirstSearch(graph, source: nodeA)
72+
73+
XCTAssertEqual(nodesExplored, ["a", "b", "h", "c", "g", "i", "d", "f", "e"])
74+
75+
}
76+
77+
func testExploringGraphWithASingleNode() {
78+
let graph = Graph()
79+
let node = graph.addNode("a")
80+
81+
let nodesExplored = breadthFirstSearch(graph, source: node)
82+
83+
XCTAssertEqual(nodesExplored, ["a"])
784
}
885
}

0 commit comments

Comments
 (0)