Introducción

1

¿Qué es un grafo?

2

¿Qué es un árbol?

3

¿Qué es recursión?

4

Aplicaciones reales de grafos y árboles

5

Formas de representar un grafo

DFS

6

Análisis de DFS: algoritmo de búsqueda en profundidad

7

Programando DFS de forma recursiva

8

Otras formas de programar DFS

9

Recorridos y profundidad de un Árbol

10

Sum Root to Leaf Numbers: análisis del problema

11

Solución de Sum Root to Leaf Numbers

12

Playground: Sum Root to Leaf Numbers

13

Programando Sum Root to Leaf Numbers en Golang

14

Number of Islands: análisis del problema

15

Solución de Number of Islands

16

Playground: Number of Islands

17

Programando Number of Islands en Python

18

Ejercicios recomendados de DFS

19

Ejercicios resueltos de DFS

BFS

20

Análisis de BFS: algoritmo de búsqueda en anchura

21

Programando BFS con Python

22

Minimum Knights Moves (movimientos de caballo en ajedrez): análisis del problema

23

Solución de Minimum Knights Moves

24

Playground: Minimum Knights Moves

25

Programando Minimum Knights Moves con Python

26

Rotting Oranges: análisis del problema

27

Solución de Rotting Oranges

28

Playground: Rotting Oranges

29

Rotting Oranges con Java

30

Shortest Bridge Between Islands: análisis del problema

31

Solución de Shortest Bridge Between Islands

32

Playground: Shortest Bridge Between Islands

33

Programando Shortest Bridge Between Islands con Python

34

Ejercicios recomendados de BFS

35

Ejercicios resueltos de BFS

Backtrack

36

Algoritmo de Backtrack

37

Letter Combinations of a Phone Number: análisis del problema

38

Solución de Letter Combinations of a Phone Number

39

Programando Letter Combinations of a Phone Number con C++

40

Playground: Letter Combinations of a Phone Number

41

Restore IP Addresses: análisis del problema

42

Programando Restore IP Addresses con C++

43

Playground: Restore IP Addresses

44

Word Search: análisis del problema

45

Solución de Word Search

46

Playgrund: Word Search

47

Programando Word Search JavaScript

48

Reto: N Queens Puzzle

49

Ejercicios recomendados de Backtrack

50

Ejercicios resueltos de Backtrack

Próximos pasos

51

¿Qué otros algoritmos y tipos de grafos puedes aprender?

52

¿Quieres más cursos avanzados de algoritmos?

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Programando BFS con Python

21/52
Recursos

¿Cómo implementar BFS para recorrer un árbol?

El algoritmo de Búsqueda en Anchura (BFS, por sus siglas en inglés) es una técnica popular para explorar o recorrer estructuras de datos, como árboles o grafos. En este caso, aprenderemos cómo implementar BFS en un árbol y cómo imprimir todos sus valores de manera eficiente utilizando colas. Este enfoque es esencial para cualquier programador y puede aplicarse en diversos lenguajes de programación.

¿Cómo se configura la función BFS?

Primero, definimos una función que llamaremos BFS, la cual recibirá como entrada el nodo raíz del árbol. El objetivo es retornar una lista con los nodos organizados en el orden que BFS precisa. Aquí está cómo se estructura:

def BFS(raiz):
    if not raiz:
        return []  # Si no hay raíz, simplemente retornamos una lista vacía
    
    respuesta = []  # Lista donde guardaremos el orden de los nodos
    cola = [raiz]  # Iniciamos la cola con el nodo raíz
    
    nivel = 0  # Contador de niveles del árbol
    while cola:  # Mientras haya elementos en la cola
        nivel += 1
        for _ in range(len(cola)):
            nodo_actual = cola.pop(0)  # Sacamos el primer elemento de la cola
            # Aquí se procesa el nodo_actual si es necesario
            respuesta.append(nodo_actual)  # Añadimos el nodo actual a la respuesta
            # Añadimos los hijos del nodo actual a la cola
            for hija in nodo_actual.hijas:
                cola.append(hija)

    print("La cantidad de niveles de este árbol es", nivel)
    return respuesta

¿Cómo se trata el recorrido del árbol por niveles?

Durante la ejecución del algoritmo, se maneja un contador de nivel que incrementa cada vez que completamos un nivel del árbol. Esto es parte fundamental para entender la profundidad del árbol recorrido por BFS.

  1. Inicialización de la cola: Se comienza la cola con el nodo raíz.
  2. Iteración por nivel: Mientras existan nodos en la cola, se incrementa el contador de nivel y se procesa cada nodo.
  3. Procesamiento de nodos: Se extrae cada nodo de la cola, se procesa (si es necesario) y se agregan sus hijos a la cola, para así considerar el siguiente nivel.

¿Cómo se manejan los hijos de un nodo?

En este algoritmo, se supone inicialmente que los nodos podrías tener múltiples hijos almacenados en una lista llamada hijas. Este modelo se adapta a árboles n-arios, sin embargo, para árboles binarios, podrías manejarlo directamente mediante propiedades izquierda y derecha.

Ejemplo de manejo de hijos en un árbol binario:

if nodo_actual.izquierda:
    cola.append(nodo_actual.izquierda)
if nodo_actual.derecha:
    cola.append(nodo_actual.derecha)

Esta modificación permite adaptar BFS a cualquier tipo de árbol, siendo flexible y eficiente.

¿Qué hacemos al finalizar la iteración del árbol?

Una vez que el algoritmo ha recorrido todos los niveles y procesado cada nodo, puedes realizar diversas tareas como imprimir el resultado. En este caso, el BFS completo resultará en una lista respuesta que contiene los nodos en el orden específico de búsqueda en anchura.

El método BFS es un paradigma fundamental en informática para el manejo y procesamiento de estructuras de datos complejas. ¡Esperamos que estos conocimientos fortalezcan tus habilidades y te motiven a seguir explorando otros algoritmos esenciales!

Aportes 2

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?


<
# Definimos una función para realizar la búsqueda en amplitud.
def bfs(graph, start):
    # Creamos un conjunto para llevar un registro de los nodos visitados.
    visited = set()
    # Inicializamos una lista como cola con el nodo de inicio.
    queue = [start]

    while queue:
        # Sacamos el primer elemento de la lista como si fuera una cola.
        node = queue.pop(0)

        if node not in visited:
            # Imprimimos el nodo visitado (puedes hacer otra cosa con él).
            print(node)
            visited.add(node)   # Agregamos el nodo a la lista de visitados.

            # Agregamos los nodos vecinos no visitados a la cola.
            for neighbour in graph[node]:
                if neighbour not in visited:
                    queue.append(neighbour)


# Creamos un grafo representado como un diccionario de listas de adyacencia.
graph = {
    'A': ['B', 'C'],
    'B': ['A', 'D', 'E'],
    'C': ['A', 'F'],
    'D': ['B'],
    'E': ['B', 'F'],
    'F': ['C', 'E']
}

# Llamamos a la función BFS desde el nodo de inicio 'A'.
bfs(graph, 'A')

> 
``` def bfs(graph, node): visited = \[] queue = \[] visited.append(node) queue.append(node) while queue: s = queue.pop(0) print(s, end = "") for n in graph\[s]: if n not in visited: visited.append(n) queue.append(n) graph = { 'A': \['B','C'], 'B': \['D','E','F'], 'C': \['G'], 'D': \[], 'E': \[], 'F': \['H'], 'G': \['I'], 'H': \[], 'I': \[], } ```