Depth First Traversal
Depth first traversal, also known as depth first search or DFS, is an algorithm for traversing or searching tree or graph data structures. One starts at the root (selecting some arbitrary node as the root in the case of a graph) and explores as far as possible along each branch before backtracking.
Public Structure Vertex
Public Label As Char
Public Visited As Boolean
End Structure
Private Shared _top As Integer = -1
Private Shared _vertexCount As Integer = 0
Private Shared Sub Push(stack As Integer(), item As Integer)
_top += 1
stack(_top) = item
End Sub
Private Shared Function Pop(stack As Integer()) As Integer
Dim retVal = stack(_top)
_top -= 1
Return retVal
End Function
Private Shared Function Peek(stack As Integer()) As Integer
Return stack(_top)
End Function
Private Shared Function IsStackEmpty() As Boolean
Return _top = -1
End Function
Public Shared Sub AddVertex(arrVertices As Vertex(), label As Char)
Dim vertex As New Vertex()
vertex.Label = label
vertex.Visited = False
arrVertices(_vertexCount) = vertex
_vertexCount += 1
End Sub
Public Shared Sub AddEdge(adjacencyMatrix As Integer(,), start As Integer, [end] As Integer)
adjacencyMatrix(start, [end]) = 1
adjacencyMatrix([end], start) = 1
End Sub
Private Shared Sub DisplayVertex(arrVertices As Vertex(), vertexIndex As Integer)
Console.Write(arrVertices(vertexIndex).Label & " ")
End Sub
Private Shared Function GetAdjacentUnvisitedVertex(arrVertices As Vertex(), adjacencyMatrix As Integer(,), vertexIndex As Integer) As Integer
For i As Integer = 0 To _vertexCount - 1
If adjacencyMatrix(vertexIndex, i) = 1 AndAlso arrVertices(i).Visited = False Then
Return i
End If
Next
Return -1
End Function
Public Shared Sub DepthFirstSearch(arrVertices As Vertex(), adjacencyMatrix As Integer(,), stack As Integer())
arrVertices(0).Visited = True
DisplayVertex(arrVertices, 0)
Push(stack, 0)
While Not IsStackEmpty()
Dim unvisitedVertex As Integer = GetAdjacentUnvisitedVertex(arrVertices, adjacencyMatrix, Peek(stack))
If unvisitedVertex = -1 Then
Pop(stack)
Else
arrVertices(unvisitedVertex).Visited = True
DisplayVertex(arrVertices, unvisitedVertex)
Push(stack, unvisitedVertex)
End If
End While
For i As Integer = 0 To _vertexCount - 1
arrVertices(i).Visited = False
Next
End Sub
Example
Dim max As Integer = 5
Dim stack As Integer() = New Integer(max - 1) {}
Dim arrVertices As Vertex() = New Vertex(max - 1) {}
Dim adjacencyMatrix As Integer(,) = New Integer(max - 1, max - 1) {}
For i As Integer = 0 To max - 1
For j As Integer = 0 To max - 1
adjacencyMatrix(i, j) = 0
Next
Next
AddVertex(arrVertices, "S"c)
AddVertex(arrVertices, "A"c)
AddVertex(arrVertices, "B"c)
AddVertex(arrVertices, "C"c)
AddVertex(arrVertices, "D"c)
AddEdge(adjacencyMatrix, 0, 1)
AddEdge(adjacencyMatrix, 0, 2)
AddEdge(adjacencyMatrix, 0, 3)
AddEdge(adjacencyMatrix, 1, 4)
AddEdge(adjacencyMatrix, 2, 4)
AddEdge(adjacencyMatrix, 3, 4)
Console.Write("Depth First Search: ")
DepthFirstSearch(arrVertices, adjacencyMatrix, stack)
Output
Depth First Search: S A D B C