Búsqueda en profundidad (DFS)

Estructuras de datos y algoritmos en Python

Miriam Antona

Software engineer

Recorrido de árboles/grafos

  • Proceso de visitar todos los nodos
  • Búsqueda en profundidad (DFS)
  • Búsqueda en anchura (BFS)
Estructuras de datos y algoritmos en Python

Búsqueda en profundidad - árboles binarios

  • In-order
  • Pre-order
  • Post-order
Estructuras de datos y algoritmos en Python

Recorrido in-order

  • Orden: Izquierda
Estructuras de datos y algoritmos en Python

Recorrido in-order

  • Orden: Izquierda -> Actual
Estructuras de datos y algoritmos en Python

Recorrido in-order

  • Orden: Izquierda -> Actual -> Derecha

Representación gráfica del recorrido in-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido in-order

  • Orden: Izquierda -> Actual -> Derecha

Representación gráfica del recorrido in-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido in-order

  • Orden: Izquierda -> Actual -> Derecha

Representación gráfica del recorrido in-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido in-order

  • Orden: Izquierda -> Actual -> Derecha

Representación gráfica del recorrido in-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido in-order

  • Orden: Izquierda -> Actual -> Derecha

Representación gráfica del recorrido in-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido in-order

  • Orden: Izquierda -> Actual -> Derecha

Representación gráfica del recorrido in-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido in-order

  • Orden: Izquierda -> Actual -> Derecha

Representación gráfica del recorrido in-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido in-order

  • Orden: Izquierda -> Actual -> Derecha

Representación gráfica del recorrido in-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido in-order

  • Orden: Izquierda -> Actual -> Derecha

Representación gráfica del recorrido in-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido in-order

  • Orden: Izquierda -> Actual -> Derecha

Representación gráfica del recorrido in-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido in-order

  • Orden: Izquierda -> Actual -> Derecha

Representación gráfica del recorrido in-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido in-order

  • Orden: Izquierda -> Actual -> Derecha

Representación gráfica del recorrido in-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido in-order

  • Orden: Izquierda -> Actual -> Derecha

Representación gráfica del recorrido in-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido in-order

  • Orden: Izquierda -> Actual -> Derecha

Representación gráfica del recorrido in-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido in-order

  • Orden: Izquierda -> Actual -> Derecha

Representación gráfica del recorrido in-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido in-order

  • Orden: Izquierda -> Actual -> Derecha

Representación gráfica del recorrido in-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido in-order

  • Orden: Izquierda -> Actual -> Derecha

Representación gráfica del recorrido in-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido in-order

  • Orden: Izquierda -> Actual -> Derecha

Representación gráfica del recorrido in-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido in-order - implementación

  • Orden: Izquierda -> Actual -> Derecha
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

Representación gráfica de un árbol binario de búsqueda.

  • Complejidad: $O(n)$
    • $n$ -> número de nodos
Estructuras de datos y algoritmos en Python

Recorrido pre-order

  • Orden: Actual
Estructuras de datos y algoritmos en Python

Recorrido pre-order

  • Orden: Actual -> Izquierda
Estructuras de datos y algoritmos en Python

Recorrido pre-order

  • Orden: Actual -> Izquierda -> Derecha

Representación gráfica del recorrido pre-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido pre-order

  • Orden: Actual -> Izquierda -> Derecha

Representación gráfica del recorrido pre-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido pre-order

  • Orden: Actual -> Izquierda -> Derecha

Representación gráfica del recorrido pre-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido pre-order

  • Orden: Actual -> Izquierda -> Derecha

Representación gráfica del recorrido pre-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido pre-order

  • Orden: Actual -> Izquierda -> Derecha

Representación gráfica del recorrido pre-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido pre-order

  • Orden: Actual -> Izquierda -> Derecha

Representación gráfica del recorrido pre-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido pre-order

  • Orden: Actual -> Izquierda -> Derecha

Representación gráfica del recorrido pre-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido pre-order

  • Orden: Actual -> Izquierda -> Derecha

Representación gráfica del recorrido pre-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido pre-order

  • Orden: Actual -> Izquierda -> Derecha

Representación gráfica del recorrido pre-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido pre-order

  • Orden: Actual -> Izquierda -> Derecha

Representación gráfica del recorrido pre-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido pre-order

  • Orden: Actual -> Izquierda -> Derecha

Representación gráfica del recorrido pre-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido pre-order

  • Orden: Actual -> Izquierda -> Derecha

Representación gráfica del recorrido pre-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido pre-order

  • Orden: Actual -> Izquierda -> Derecha

Representación gráfica del recorrido pre-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido pre-order

  • Orden: Actual -> Izquierda -> Derecha

Representación gráfica del recorrido pre-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido pre-order

  • Orden: Actual -> Izquierda -> Derecha

Representación gráfica del recorrido pre-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido pre-order

  • Orden: Actual -> Izquierda -> Derecha

Representación gráfica del recorrido pre-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido pre-order

  • Orden: Actual -> Izquierda -> Derecha

Representación gráfica del recorrido pre-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido pre-order

  • Orden: Actual -> Izquierda -> Derecha

Representación gráfica del recorrido pre-order en un árbol binario de búsqueda.

Estructuras de datos y algoritmos en Python

Recorrido pre-order - implementación

  • Orden: Raíz -> Izquierda -> Derecha
  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

Representación gráfica de un árbol binario de búsqueda.

  • Complejidad: $O(n)$
    • $n$ -> número de nodos
Estructuras de datos y algoritmos en Python

Post-order

  • Orden: Izquierda
Estructuras de datos y algoritmos en Python

Post-order

  • Orden: Izquierda -> Derecha
Estructuras de datos y algoritmos en Python

Post-order

  • Orden: Izquierda -> Derecha -> Actual

  • Complejidad: $O(n)$

    • $n$ -> número de nodos
Estructuras de datos y algoritmos en Python

Cuándo usar in-order, pre-order y post-order

  • in-order

    • usar BST para obtener valores en orden ascendente
  • pre-order

    • crear copias de un árbol
    • obtener expresiones prefijas
  • post-order

    • borrar árboles binarios
    • obtener expresiones posfijas
Estructuras de datos y algoritmos en Python

Búsqueda en profundidad - grafos

  • Los grafos pueden tener ciclos
    • hay que registrar los vértices visitados
  • Pasos:
    1. Empieza en cualquier vértice
    2. Añade el vértice actual a la lista de visitados
    3. Para cada vértice adyacente del actual
      • Si ya se visitó -> ignóralo
      • Si no se visitó -> haz DFS recursivo
Estructuras de datos y algoritmos en Python

Búsqueda en profundidad - grafos

Representación gráfica de la búsqueda en profundidad en un grafo.

Estructuras de datos y algoritmos en Python

Búsqueda en profundidad - grafos

Representación gráfica de la búsqueda en profundidad en un grafo.

Estructuras de datos y algoritmos en Python

Búsqueda en profundidad - grafos

Representación gráfica de la búsqueda en profundidad en un grafo.

Estructuras de datos y algoritmos en Python

Búsqueda en profundidad - grafos

Representación gráfica de la búsqueda en profundidad en un grafo.

Estructuras de datos y algoritmos en Python

Búsqueda en profundidad - grafos

Representación gráfica de la búsqueda en profundidad en un grafo.

Estructuras de datos y algoritmos en Python

Búsqueda en profundidad - grafos

Representación gráfica de la búsqueda en profundidad en un grafo.

Estructuras de datos y algoritmos en Python

Búsqueda en profundidad - grafos

Representación gráfica de la búsqueda en profundidad en un grafo.

Estructuras de datos y algoritmos en Python

Búsqueda en profundidad - grafos

Representación gráfica de la búsqueda en profundidad en un grafo.

Estructuras de datos y algoritmos en Python

Búsqueda en profundidad - grafos

Representación gráfica de la búsqueda en profundidad en un grafo.

Estructuras de datos y algoritmos en Python

Búsqueda en profundidad - grafos

Representación gráfica de la búsqueda en profundidad en un grafo.

Estructuras de datos y algoritmos en Python

Búsqueda en profundidad - grafos

Representación gráfica de la búsqueda en profundidad en un grafo.

Estructuras de datos y algoritmos en Python

Búsqueda en profundidad - grafos

Representación gráfica de la búsqueda en profundidad en un grafo.

Estructuras de datos y algoritmos en Python

Búsqueda en profundidad - grafos

Representación gráfica de la búsqueda en profundidad en un grafo.

Estructuras de datos y algoritmos en Python

Búsqueda en profundidad - grafos

Representación gráfica de la búsqueda en profundidad en un grafo.

Estructuras de datos y algoritmos en Python

Búsqueda en profundidad - grafos

Representación gráfica de la búsqueda en profundidad en un grafo.

Estructuras de datos y algoritmos en Python

Búsqueda en profundidad - grafos

Representación gráfica de la búsqueda en profundidad en un grafo.

Estructuras de datos y algoritmos en Python

Búsqueda en profundidad - grafos

Representación gráfica de la búsqueda en profundidad en un grafo.

Estructuras de datos y algoritmos en Python

Búsqueda en profundidad - grafos

Representación gráfica de la búsqueda en profundidad en un grafo.

Estructuras de datos y algoritmos en Python

Búsqueda en profundidad - grafos

Representación gráfica de la búsqueda en profundidad en un grafo.

Estructuras de datos y algoritmos en Python

Búsqueda en profundidad - grafos

Representación gráfica de la búsqueda en profundidad en un grafo.

Estructuras de datos y algoritmos en Python

Búsqueda en profundidad - grafos

Representación gráfica de la búsqueda en profundidad en un grafo.

Estructuras de datos y algoritmos en Python

Búsqueda en profundidad - grafos

Representación gráfica de la búsqueda en profundidad en un grafo.

Estructuras de datos y algoritmos en Python

Búsqueda en profundidad - grafos

Representación gráfica de la búsqueda en profundidad en un grafo.

Estructuras de datos y algoritmos en Python

Búsqueda en profundidad - implementación

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)
  • Complejidad: $O(V+E)$
    • $V$ -> número de vértices
    • $E$ -> número de aristas
Estructuras de datos y algoritmos en Python

¡Vamos a practicar!

Estructuras de datos y algoritmos en Python

Preparing Video For Download...