Поиск в глубину (DFS)

Структуры данных и алгоритмы на Python

Miriam Antona

Software engineer

Обход дерева/графа

  • Процесс обхода всех узлов
  • Поиск в глубину (DFS)
  • Поиск в ширину (BFS)
Структуры данных и алгоритмы на Python

Поиск в глубину — бинарные деревья

  • Симметричный (In-order)
  • Прямой (Pre-order)
  • Обратный (Post-order)
Структуры данных и алгоритмы на Python

Симметричный обход (In-order)

  • Порядок: Левый
Структуры данных и алгоритмы на Python

Симметричный обход (In-order)

  • Порядок: Левый -> Текущий
Структуры данных и алгоритмы на Python

Симметричный обход (In-order)

  • Порядок: Левый -> Текущий -> Правый

Графическое представление симметричного обхода бинарного дерева поиска.

Структуры данных и алгоритмы на Python

Симметричный обход (In-order)

  • Порядок: Левый -> Текущий -> Правый

Графическое представление симметричного обхода бинарного дерева поиска.

Структуры данных и алгоритмы на Python

Симметричный обход (In-order)

  • Порядок: Левый -> Текущий -> Правый

Графическое представление симметричного обхода бинарного дерева поиска.

Структуры данных и алгоритмы на Python

Симметричный обход (In-order)

  • Порядок: Левый -> Текущий -> Правый

Графическое представление симметричного обхода бинарного дерева поиска.

Структуры данных и алгоритмы на Python

Симметричный обход (In-order)

  • Порядок: Левый -> Текущий -> Правый

Графическое представление симметричного обхода бинарного дерева поиска.

Структуры данных и алгоритмы на Python

Симметричный обход

  • Порядок: Левый -> Текущий -> Правый

Графическое представление симметричного обхода бинарного дерева поиска.

Структуры данных и алгоритмы на Python

Симметричный обход

  • Порядок: Левый -> Текущий -> Правый

Графическое представление симметричного обхода двоичного дерева поиска.

Структуры данных и алгоритмы на Python

Симметричный обход

  • Порядок: Левый -> Текущий -> Правый

Графическое представление симметричного обхода двоичного дерева поиска.

Структуры данных и алгоритмы на Python

Симметричный обход

  • Порядок: Левый -> Текущий -> Правый

Графическое представление симметричного обхода двоичного дерева поиска.

Структуры данных и алгоритмы на Python

Симметричный обход

  • Порядок: Левый -> Текущий -> Правый

Графическое представление симметричного обхода двоичного дерева поиска.

Структуры данных и алгоритмы на Python

Симметричный обход

  • Порядок: Левый -> Текущий -> Правый

Графическое представление симметричного обхода двоичного дерева поиска.

Структуры данных и алгоритмы на Python

Симметричный обход

  • Порядок: Левый -> Текущий -> Правый

Графическое представление симметричного обхода двоичного дерева поиска.

Структуры данных и алгоритмы на Python

Симметричный обход

  • Порядок: Левый -> Текущий -> Правый

Графическое представление симметричного обхода двоичного дерева поиска.

Структуры данных и алгоритмы на Python

Симметричный обход

  • Порядок: Левый -> Текущий -> Правый

Графическое представление симметричного обхода двоичного дерева поиска.

Структуры данных и алгоритмы на Python

Симметричный обход

  • Порядок: Левый -> Текущий -> Правый

Графическое представление симметричного обхода двоичного дерева поиска.

Структуры данных и алгоритмы на Python

Симметричный обход

  • Порядок: Левый -> Текущий -> Правый

Графическое представление симметричного обхода двоичного дерева поиска.

Структуры данных и алгоритмы на Python

Симметричный обход

  • Порядок: Левый -> Текущий -> Правый

Графическое представление симметричного обхода двоичного дерева поиска.

Структуры данных и алгоритмы на Python

Симметричный обход

  • Порядок: Левый -> Текущий -> Правый

Графическое представление симметричного обхода двоичного дерева поиска.

Структуры данных и алгоритмы на Python

Симметричный обход — реализация

  • Порядок: Левый -> Текущий -> Правый
def in_order(self, current_node):

if current_node:
self.in_order(current_node.left_child)
print(current_node.data)
self.in_order(current_node.right_child)
my_tree.in_order(my_tree.root)
10
20
22
65
68
70
75

Графическое представление двоичного дерева поиска.

  • Сложность: $O(n)$
    • $n$ -> количество узлов
Структуры данных и алгоритмы на Python

Прямой обход

  • Порядок: Текущий
Структуры данных и алгоритмы на Python

Прямой обход

  • Порядок: Текущий -> Левый
Структуры данных и алгоритмы на Python

Прямой обход

  • Порядок: Текущий -> Левый -> Правый

Графическое представление прямого обхода двоичного дерева поиска.

Структуры данных и алгоритмы на Python

Прямой обход

  • Порядок: Текущий -> Левый -> Правый

Графическое представление прямого обхода двоичного дерева поиска.

Структуры данных и алгоритмы на Python

Прямой обход

  • Порядок: Текущий -> Левый -> Правый

Графическое представление прямого обхода двоичного дерева поиска.

Структуры данных и алгоритмы на Python

Прямой обход

  • Порядок: Текущий -> Левый -> Правый

Графическое представление прямого обхода двоичного дерева поиска.

Структуры данных и алгоритмы на Python

Обход в прямом порядке

  • Порядок: Текущий -> Левый -> Правый

Графическое представление обхода в прямом порядке для двоичного дерева поиска.

Структуры данных и алгоритмы на Python

Обход в прямом порядке

  • Порядок: Текущий -> Левый -> Правый

Графическое представление обхода в прямом порядке для двоичного дерева поиска.

Структуры данных и алгоритмы на Python

Обход в прямом порядке

  • Порядок: Текущий -> Левый -> Правый

Графическое представление обхода в прямом порядке для двоичного дерева поиска.

Структуры данных и алгоритмы на Python

Обход в прямом порядке

  • Порядок: Текущий -> Левый -> Правый

Графическое представление обхода в прямом порядке для двоичного дерева поиска.

Структуры данных и алгоритмы на Python

Обход в прямом порядке

  • Порядок: Текущий -> Левый -> Правый

Графическое представление обхода в прямом порядке для двоичного дерева поиска.

Структуры данных и алгоритмы на Python

Обход в прямом порядке

  • Порядок: Текущий -> Левый -> Правый

Графическое представление обхода в прямом порядке для двоичного дерева поиска.

Структуры данных и алгоритмы на Python

Обход в прямом порядке

  • Порядок: Текущий -> Левый -> Правый

Графическое представление обхода в прямом порядке для двоичного дерева поиска.

Структуры данных и алгоритмы на Python

Обход в прямом порядке

  • Порядок: Текущий -> Левый -> Правый

Графическое представление обхода в прямом порядке для двоичного дерева поиска.

Структуры данных и алгоритмы на Python

Обход в прямом порядке

  • Порядок: Текущий -> Левый -> Правый

Графическое представление обхода в прямом порядке для двоичного дерева поиска.

Структуры данных и алгоритмы на Python

Обход в прямом порядке

  • Порядок: Текущий -> Левый -> Правый

Графическое представление обхода в прямом порядке для двоичного дерева поиска.

Структуры данных и алгоритмы на Python

Обход в прямом порядке

  • Порядок: Текущий -> Левый -> Правый

Графическое представление обхода в прямом порядке бинарного дерева поиска.

Структуры данных и алгоритмы на Python

Обход в прямом порядке

  • Порядок: Текущий -> Левый -> Правый

Графическое представление обхода в прямом порядке бинарного дерева поиска.

Структуры данных и алгоритмы на Python

Обход в прямом порядке

  • Порядок: Текущий -> Левый -> Правый

Графическое представление обхода в прямом порядке бинарного дерева поиска.

Структуры данных и алгоритмы на Python

Обход в прямом порядке

  • Порядок: Текущий -> Левый -> Правый

Графическое представление обхода в прямом порядке бинарного дерева поиска.

Структуры данных и алгоритмы на Python

Обход в прямом порядке — реализация

  • Порядок: Корень -> Левый -> Правый
  def pre_order(self, current_node):
    if current_node:
      print(current_node.data)
      self.pre_order(current_node.left_child)
      self.pre_order(current_node.right_child)
my_tree.pre_order(my_tree.root)
65
20
10
22
70
68
75

Графическое представление бинарного дерева поиска.

  • Сложность: $O(n)$
    • $n$ -> количество узлов
Структуры данных и алгоритмы на Python

Обратный порядок

  • Порядок: Левый
Структуры данных и алгоритмы на Python

Обратный порядок

  • Порядок: Левый -> Правый
Структуры данных и алгоритмы на Python

Обратный порядок

  • Порядок: Левый -> Правый -> Текущий

  • Сложность: $O(n)$

    • $n$ -> количество узлов
Структуры данных и алгоритмы на Python

Когда применять симметричный, прямой и обратный обход

  • Симметричный обход

    • получение значений узлов в порядке возрастания с помощью BST
  • Прямой обход

    • создание копий дерева
    • получение префиксных выражений
  • Обратный обход

    • удаление бинарных деревьев
    • получение постфиксных выражений
Структуры данных и алгоритмы на Python

Поиск в глубину — графы

  • Графы могут содержать циклы
    • необходимо отслеживать посещённые вершины
  • Шаги:
    1. Начать с любой вершины
    2. Добавить текущую вершину в список посещённых
    3. Для каждой смежной вершины текущего узла
      • Если уже посещена -> игнорировать
      • Если не посещена -> рекурсивно выполнить DFS
Структуры данных и алгоритмы на Python

Поиск в глубину — графы

Графическое представление поиска в глубину по графу.

Структуры данных и алгоритмы на Python

Поиск в глубину — графы

Графическое представление поиска в глубину по графу.

Структуры данных и алгоритмы на Python

Поиск в глубину — графы

Графическое представление поиска в глубину по графу.

Структуры данных и алгоритмы на Python

Поиск в глубину — графы

Графическое представление поиска в глубину по графу.

Структуры данных и алгоритмы на Python

Поиск в глубину — графы

Графическое представление поиска в глубину по графу.

Структуры данных и алгоритмы на Python

Поиск в глубину — графы

Графическое представление поиска в глубину по графу.

Структуры данных и алгоритмы на Python

Поиск в глубину — графы

Графическое представление поиска в глубину по графу.

Структуры данных и алгоритмы на Python

Поиск в глубину — графы

Графическое представление поиска в глубину по графу.

Структуры данных и алгоритмы на Python

Поиск в глубину — графы

Графическое представление поиска в глубину по графу.

Структуры данных и алгоритмы на Python

Поиск в глубину — графы

Графическое представление поиска в глубину по графу.

Структуры данных и алгоритмы на Python

Поиск в глубину — графы

Графическое представление поиска в глубину на графе.

Структуры данных и алгоритмы на Python

Поиск в глубину — графы

Графическое представление поиска в глубину на графе.

Структуры данных и алгоритмы на Python

Поиск в глубину — графы

Графическое представление поиска в глубину на графе.

Структуры данных и алгоритмы на Python

Поиск в глубину — графы

Графическое представление поиска в глубину на графе.

Структуры данных и алгоритмы на Python

Поиск в глубину — графы

Графическое представление поиска в глубину на графе.

Структуры данных и алгоритмы на Python

Поиск в глубину — графы

Графическое представление поиска в глубину на графе.

Структуры данных и алгоритмы на Python

Поиск в глубину — графы

Графическое представление поиска в глубину на графе.

Структуры данных и алгоритмы на Python

Поиск в глубину — графы

Графическое представление поиска в глубину на графе.

Структуры данных и алгоритмы на Python

Поиск в глубину — графы

Графическое представление поиска в глубину на графе.

Структуры данных и алгоритмы на Python

Поиск в глубину — графы

Графическое представление поиска в глубину на графе.

Структуры данных и алгоритмы на Python

Поиск в глубину — графы

Графическое представление поиска в глубину по графу.

Структуры данных и алгоритмы на Python

Поиск в глубину — графы

Графическое представление поиска в глубину по графу.

Структуры данных и алгоритмы на Python

Поиск в глубину — графы

Графическое представление поиска в глубину по графу.

Структуры данных и алгоритмы на Python

Поиск в глубину — реализация

def dfs(visited_vertices, graph, current_vertex):
    if current_vertex not in visited_vertices:
        print(current_vertex)
        visited_vertices.add(current_vertex)
        for adjacent_vertex in graph[current_vertex]:
            dfs(visited_vertices, graph, adjacent_vertex)
  • Сложность: $O(V+E)$
    • $V$ -> количество вершин
    • $E$ -> количество рёбер
Структуры данных и алгоритмы на Python

Давайте потренируемся!

Структуры данных и алгоритмы на Python

Preparing Video For Download...