Breadth First Search (BFS)

Cấu trúc dữ liệu và Thuật toán với Python

Miriam Antona

Software engineer

Breadth first search - binary trees

  • Starts from the root
  • Visits every node of every level

Graphical representation of bread first search over a binary search tree.

Cấu trúc dữ liệu và Thuật toán với Python

Breadth first search - binary trees

  def bfs(self):

if self.root:
visited_nodes = []
bfs_queue = queue.SimpleQueue()

Graphical representation of a binary search tree.

  • visited_nodes:
  • bfs_queue:
Cấu trúc dữ liệu và Thuật toán với Python

Breadth first search - binary trees

  def bfs(self):
    if self.root:
      visited_nodes = []
      bfs_queue = queue.SimpleQueue()
      bfs_queue.put(self.root)

while not bfs_queue.empty():

Graphical representation of a binary search tree.

  • visited_nodes:
  • bfs_queue: 65
Cấu trúc dữ liệu và Thuật toán với Python

Breadth first search - binary trees

  def bfs(self):
    if self.root:
      visited_nodes = []
      bfs_queue = queue.SimpleQueue()
      bfs_queue.put(self.root)
      while not bfs_queue.empty():
        current_node = bfs_queue.get()






Graphical representation of a binary search tree.

  • visited_nodes:
  • bfs_queue:
  • current_node: 65
Cấu trúc dữ liệu và Thuật toán với Python

Breadth first search - binary trees

  def bfs(self):

if self.root: visited_nodes = [] bfs_queue = queue.SimpleQueue() bfs_queue.put(self.root) while not bfs_queue.empty(): current_node = bfs_queue.get() visited_nodes.append(current_node.data)
if current_node.left:

Graphical representation of a binary search tree.

  • visited_nodes: 65
  • bfs_queue:
  • current_node: 65
Cấu trúc dữ liệu và Thuật toán với Python

Breadth first search - binary trees

  def bfs(self):

if self.root: visited_nodes = [] bfs_queue = queue.SimpleQueue() bfs_queue.put(self.root) while not bfs_queue.empty(): current_node = bfs_queue.get() visited_nodes.append(current_node.data) if current_node.left: bfs_queue.put(current_node.left)

Graphical representation of a binary search tree.

  • visited_nodes: 65
  • bfs_queue: 20
  • current_node: 65
Cấu trúc dữ liệu và Thuật toán với Python

Breadth first search - binary trees

  def bfs(self):
    if self.root:
      visited_nodes = []
      bfs_queue = queue.SimpleQueue()
      bfs_queue.put(self.root)
      while not bfs_queue.empty():
        current_node = bfs_queue.get()
        visited_nodes.append(current_node.data)
        if current_node.left:
          bfs_queue.put(current_node.left)
        if current_node.right:
          bfs_queue.put(current_node.right)

Graphical representation of a binary search tree.

  • visited_nodes: 65
  • bfs_queue: 20, 70
  • current_node: 65
Cấu trúc dữ liệu và Thuật toán với Python

Breadth first search - binary trees

  def bfs(self):
    if self.root:
      visited_nodes = []
      bfs_queue = queue.SimpleQueue()
      bfs_queue.put(self.root)
      while not bfs_queue.empty():
        current_node = bfs_queue.get()
        visited_nodes.append(current_node.data)
        if current_node.left:
          bfs_queue.put(current_node.left)
        if current_node.right:
          bfs_queue.put(current_node.right)

Graphical representation of a binary search tree.

  • visited_nodes: 65
  • bfs_queue: 70
  • current_node: 20
Cấu trúc dữ liệu và Thuật toán với Python

Breadth first search - binary trees

  def bfs(self):
    if self.root:
      visited_nodes = []
      bfs_queue = queue.SimpleQueue()
      bfs_queue.put(self.root)
      while not bfs_queue.empty():
        current_node = bfs_queue.get()
        visited_nodes.append(current_node.data)
        if current_node.left:
          bfs_queue.put(current_node.left)
        if current_node.right:
          bfs_queue.put(current_node.right)

Graphical representation of a binary search tree.

  • visited_nodes: 65, 20
  • bfs_queue: 70
  • current_node: 20
Cấu trúc dữ liệu và Thuật toán với Python

Breadth first search - binary trees

  def bfs(self):
    if self.root:
      visited_nodes = []
      bfs_queue = queue.SimpleQueue()
      bfs_queue.put(self.root)
      while not bfs_queue.empty():
        current_node = bfs_queue.get()
        visited_nodes.append(current_node.data)
        if current_node.left:
          bfs_queue.put(current_node.left)
        if current_node.right:
          bfs_queue.put(current_node.right)

Graphical representation of a binary search tree.

  • visited_nodes: 65, 20
  • bfs_queue: 70, 10
  • current_node: 20
Cấu trúc dữ liệu và Thuật toán với Python

Breadth first search - binary trees

  def bfs(self):
    if self.root:
      visited_nodes = []
      bfs_queue = queue.SimpleQueue()
      bfs_queue.put(self.root)
      while not bfs_queue.empty():
        current_node = bfs_queue.get()
        visited_nodes.append(current_node.data)
        if current_node.left:
          bfs_queue.put(current_node.left)
        if current_node.right:
          bfs_queue.put(current_node.right)

Graphical representation of a binary search tree.

  • visited_nodes: 65, 20
  • bfs_queue: 70, 10, 22
  • current_node: 20
Cấu trúc dữ liệu và Thuật toán với Python

Breadth first search - binary trees

  def bfs(self):
    if self.root:
      visited_nodes = []
      bfs_queue = queue.SimpleQueue()
      bfs_queue.put(self.root)
      while not bfs_queue.empty():
        current_node = bfs_queue.get()
        visited_nodes.append(current_node.data)
        if current_node.left:
          bfs_queue.put(current_node.left)
        if current_node.right:
          bfs_queue.put(current_node.right)

Graphical representation of a binary search tree.

  • visited_nodes: 65, 20
  • bfs_queue: 10, 22
  • current_node: 70
Cấu trúc dữ liệu và Thuật toán với Python

Breadth first search - binary trees

  def bfs(self):
    if self.root:
      visited_nodes = []
      bfs_queue = queue.SimpleQueue()
      bfs_queue.put(self.root)
      while not bfs_queue.empty():
        current_node = bfs_queue.get()
        visited_nodes.append(current_node.data)
        if current_node.left:
          bfs_queue.put(current_node.left)
        if current_node.right:
          bfs_queue.put(current_node.right)

Graphical representation of a binary search tree.

  • visited_nodes: 65, 20, 70
  • bfs_queue: 10, 22
  • current_node: 70
Cấu trúc dữ liệu và Thuật toán với Python

Breadth first search - binary trees

  def bfs(self):
    if self.root:
      visited_nodes = []
      bfs_queue = queue.SimpleQueue()
      bfs_queue.put(self.root)
      while not bfs_queue.empty():
        current_node = bfs_queue.get()
        visited_nodes.append(current_node.data)
        if current_node.left:
          bfs_queue.put(current_node.left)
        if current_node.right:
          bfs_queue.put(current_node.right)

Graphical representation of a binary search tree.

  • visited_nodes: 65, 20, 70
  • bfs_queue: 10, 22, 68
  • current_node: 70
Cấu trúc dữ liệu và Thuật toán với Python

Breadth first search - binary trees

  def bfs(self):
    if self.root:
      visited_nodes = []
      bfs_queue = queue.SimpleQueue()
      bfs_queue.put(self.root)
      while not bfs_queue.empty():
        current_node = bfs_queue.get()
        visited_nodes.append(current_node.data)
        if current_node.left:
          bfs_queue.put(current_node.left)
        if current_node.right:
          bfs_queue.put(current_node.right)

Graphical representation of a binary search tree.

  • visited_nodes: 65, 20, 70
  • bfs_queue: 10, 22, 68, 75
  • current_node: 70
Cấu trúc dữ liệu và Thuật toán với Python

Breadth first search - binary trees

  def bfs(self):
    if self.root:
      visited_nodes = []
      bfs_queue = queue.SimpleQueue()
      bfs_queue.put(self.root)
      while not bfs_queue.empty():
        current_node = bfs_queue.get()
        visited_nodes.append(current_node.data)
        if current_node.left:
          bfs_queue.put(current_node.left)
        if current_node.right:
          bfs_queue.put(current_node.right)

Graphical representation of a binary search tree.

  • visited_nodes: 65, 20, 70, 10
  • bfs_queue: 22, 68, 75
  • current_node: 10
Cấu trúc dữ liệu và Thuật toán với Python

Breadth first search - binary trees

  def bfs(self):
    if self.root:
      visited_nodes = []
      bfs_queue = queue.SimpleQueue()
      bfs_queue.put(self.root)
      while not bfs_queue.empty():
        current_node = bfs_queue.get()
        visited_nodes.append(current_node.data)
        if current_node.left:
          bfs_queue.put(current_node.left)
        if current_node.right:
          bfs_queue.put(current_node.right)

Graphical representation of a binary search tree.

  • visited_nodes: 65, 20, 70, 10
  • bfs_queue: 68, 75
  • current_node: 22
Cấu trúc dữ liệu và Thuật toán với Python

Breadth first search - binary trees

  def bfs(self):
    if self.root:
      visited_nodes = []
      bfs_queue = queue.SimpleQueue()
      bfs_queue.put(self.root)
      while not bfs_queue.empty():
        current_node = bfs_queue.get()
        visited_nodes.append(current_node.data)
        if current_node.left:
          bfs_queue.put(current_node.left)
        if current_node.right:
          bfs_queue.put(current_node.right)

Graphical representation of a binary search tree.

  • visited_nodes: 65, 20, 70, 10, 22
  • bfs_queue: 68, 75
  • current_node: 22
Cấu trúc dữ liệu và Thuật toán với Python

Breadth first search - binary trees

  def bfs(self):
    if self.root:
      visited_nodes = []
      bfs_queue = queue.SimpleQueue()
      bfs_queue.put(self.root)
      while not bfs_queue.empty():
        current_node = bfs_queue.get()
        visited_nodes.append(current_node.data)
        if current_node.left:
          bfs_queue.put(current_node.left)
        if current_node.right:
          bfs_queue.put(current_node.right)

Graphical representation of a binary search tree.

  • visited_nodes: 65, 20, 70, 10, 22, 68
  • bfs_queue: 75
  • current_node: 68
Cấu trúc dữ liệu và Thuật toán với Python

Breadth first search - binary trees

  def bfs(self):
    if self.root:
      visited_nodes = []
      bfs_queue = queue.SimpleQueue()
      bfs_queue.put(self.root)
      while not bfs_queue.empty():
        current_node = bfs_queue.get()
        visited_nodes.append(current_node.data)
        if current_node.left:
          bfs_queue.put(current_node.left)
        if current_node.right:
          bfs_queue.put(current_node.right)

Graphical representation of a binary search tree.

  • visited_nodes: 65, 20, 70, 10, 22, 68
  • bfs_queue:
  • current_node: 75
Cấu trúc dữ liệu và Thuật toán với Python

Breadth first search - binary trees

  def bfs(self):
    if self.root:
      visited_nodes = []
      bfs_queue = queue.SimpleQueue()
      bfs_queue.put(self.root)
      while not bfs_queue.empty():
        current_node = bfs_queue.get()
        visited_nodes.append(current_node.data)
        if current_node.left:
          bfs_queue.put(current_node.left)
        if current_node.right:
          bfs_queue.put(current_node.right)

Graphical representation of a binary search tree.

  • visited_nodes: 65, 20, 70, 10, 22, 68, 75
  • bfs_queue:
  • current_node: 75
Cấu trúc dữ liệu và Thuật toán với Python

Breadth first search - binary trees

  def bfs(self):
    if self.root:
      visited_nodes = []
      bfs_queue = queue.SimpleQueue()
      bfs_queue.put(self.root)
      while not bfs_queue.empty():
        current_node = bfs_queue.get()
        visited_nodes.append(current_node.data)
        if current_node.left:
          bfs_queue.put(current_node.left)
        if current_node.right:
          bfs_queue.put(current_node.right)
    return visited_nodes
  • Complexity: $O(n)$

Graphical representation of a binary search tree.

  • visited_nodes: 65, 20, 70, 10, 22, 68, 75
  • bfs_queue:
  • current_node: 75
Cấu trúc dữ liệu và Thuật toán với Python

Breadth first search - graphs

  • Graphs can have cycles
    • Need to check if the vertices have already been visited
Cấu trúc dữ liệu và Thuật toán với Python

Breadth first search - graphs

def bfs(graph, initial_vertex):

visited_vertices = []
bfs_queue = queue.SimpleQueue()
bfs_queue.put(initial_vertex)
visited_vertices.append(initial_vertex)
while not bfs_queue.empty():
current_vertex = bfs_queue.get()
for adjacent_vertex in graph[current_vertex]:
if adjacent_vertex not in visited_vertices:
visited_vertices.append(adjacent_vertex)
bfs_queue.put(adjacent_vertex)
return visited_vertices
  • Complexity: $O(V+E)$
    • $V$ -> number of vertices
    • $E$ -> number of edges
Cấu trúc dữ liệu và Thuật toán với Python

Breadth first search - graphs

Graphical representation of bread first search over a graph.

Cấu trúc dữ liệu và Thuật toán với Python

BFS vs DFS

BFS

  • Target close to the starting vertex
  • Applications:
    • Web crawling
    • Finding shortest path in unweighted graphs
    • Finding connected locations using GPS
    • Used as part of other more complex algorithms

DFS

  • Target far away from the starting vertex
  • Applications:
    • Solving puzzles with only one solution (e.g. mazes)
    • Detecting cycles in graphs
    • Finding shortest path in a weighted graph
    • Used as part of other more complex algorithms
Cấu trúc dữ liệu và Thuật toán với Python

Let's practice!

Cấu trúc dữ liệu và Thuật toán với Python

Preparing Video For Download...