A este punto sería bueno hacer un ejemplo práctica para entender mejor el tema.
Introducción
Grafos y Árboles: Estructuras de Datos Avanzadas
Estructuras de Datos: Introducción a Árboles y Sus Propiedades
Recursión: Concepto y Aplicaciones Prácticas con Ejemplos
Aplicaciones Prácticas de Grafos en Tecnología e Industria
Representación de Grafos: Matriz y Lista de Adyacencia
DFS
Búsqueda en Profundidad (DFS) en Árboles y Grafos
Implementación de DFS recursivo para búsqueda en árboles
Búsqueda en Profundidad (DFS) para Grafos: Enfoque Iterativo y Recursivo
Recorridos y Profundidad en Árboles Binarios y Enearios
Suma de Caminos en Árboles Binarios
Suma de Números de Raíz a Hoja en Árboles
Playground: Sum Root to Leaf Numbers
Implementación de Algoritmo DFS en Árboles Binarios con Golang
Resolución del Problema de Número de Islas con DFS
Conteo de Islas en Matrices con DFS
Playground: Number of Islands
Implementación de "Número de Islas" con Recursión en Python
Ejercicios Prácticos de Búsqueda en Profundidad (DFS)
Algoritmos de Búsqueda en Profundidad (DFS) en Problemas Comunes
BFS
Algoritmo BFS: Recorrido en Anchura de Grafos y Árboles
Implementación de BFS en Árboles usando Python
Movimiento mínimo de caballo en ajedrez infinito
Resolviendo el Problema Mínimo de Movimiento del Caballo en Ajedrez
Playground: Minimum Knights Moves
Resolución de Problemas de Caballos de Ajedrez con BFS en Python
Propagación de Plagas en Cultivos: Cálculo de Días para Contagio Total
Resolución de Rotting Oranges usando BFS
Playground: Rotting Oranges
Propagación de Plagas en Matrices usando BFS en Java
Construcción de Puentes Cortos entre Islas en Matrices Binarias
Resolución del Problema Shortest Bridge con DFS y BFS
Playground: Shortest Bridge Between Islands
Búsqueda del camino más corto entre islas usando BFS en Python
Búsqueda en anchura: Ejercicios prácticos y aplicaciones
Ejercicios avanzados de búsqueda en anchura (BFS) en programación
Backtrack
Algoritmo Backtracking: Solución de Problemas Complejos
Combinaciones de Letras en Números Telefónicos
Combinaciones de Letras a partir de un Número de Teléfono
Generación de combinaciones de letras con teclados numéricos en C++
Playground: Letter Combinations of a Phone Number
Generación de Direcciones IP Válidas a partir de Cadenas Numéricas
Generación de IPs válidas con backtracking en C++
Playground: Restore IP Addresses
Búsqueda de Palabras en Matrices: Solución y Complejidad
Búsqueda de Palabras en Matrices usando Backtracking y DFS
Playgrund: Word Search
Implementación de búsqueda de palabras en matrices con DFS en JavaScript
Resolución del problema de las n reinas en ajedrez
Ejercicios de Backtracking: Combinaciones y Permutaciones
Combinaciones y Permutaciones con Backtracking
Próximos pasos
Algoritmos de Grafos: MIN/MAX-HIP, TRI, Topological Sort y Dijkstra
Algoritmos y Estructuras de Datos en la Ingeniería
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
La implementación de algoritmos se vuelve una tarea más compleja sin un objetivo claro. En esta clase, aprenderás a implementar el algoritmo Depth First Search (DFS) para encontrar un número en un árbol, paso a paso, utilizando JavaScript. Este enfoque podrá aplicarse a cualquier lenguaje de programación y ajustarse a tus necesidades específicas.
Antes de sumergirse en la implementación, es crucial definir un objetivo específico para el algoritmo. En este caso, la meta será encontrar un número en un árbol. La función que se desarrollará tomará dos argumentos principales: la raíz del árbol y el valor que queremos localizar.
La base del algoritmo DFS recursivo se centra en dos elementos cruciales:
En caso de no localizar el nodo deseado durante la exploración, el algoritmo devuelve un resultado nulo, indicando que el valor no está presente en ese camino específico.
A continuación, se presenta una implementación de DFS en JavaScript para encontrar un número en un árbol. Esta versión recursiva puede ser la base para desarrollos más complejos adaptados a diferentes estructuras de datos.
function DFS(root, targetValue) {
console.log(`Actualmente estoy en el nodo con valor: ${root.valor}`);
if (root.valor === targetValue) {
console.log(`¡Encontré el valor ${targetValue}!`);
return root;
}
for (let i = 0; i < root.children.length; i++) {
const childNode = root.children[i];
const resultNode = DFS(childNode, targetValue);
if (resultNode !== null) {
return resultNode;
}
}
return null;
}
En un árbol binario, cada nodo tiene un máximo de dos hijos, por lo que la función simplifica la iteración sobre los hijos a dos opciones: izquierda y derecha. Aquí está un ejemplo de cómo se adapta el código para un árbol binario:
function DFSBinary(root, targetValue) {
if (root === null) return null;
console.log(`Actualmente estoy en el nodo con valor: ${root.valor}`);
if (root.valor === targetValue) {
console.log(`¡Encontré el valor ${targetValue}!`);
return root;
}
const leftResult = DFSBinary(root.izquierda, targetValue);
if (leftResult !== null) {
return leftResult;
}
const rightResult = DFSBinary(root.derecha, targetValue);
if (rightResult !== null) {
return rightResult;
}
return null;
}
DFS es crucial en la exploración exhaustiva de estructuras de datos jerárquicas, permitiendo alcanzar nodos profundos y detectar todos los posibles caminos desde un nodo raíz. Es comúnmente utilizado en problemas de grafos y es una técnica fundamental en algoritmos de búsqueda y recorridos de árboles.
DFS puede ser implementado de manera iterativa, usando una estructura de datos llamada pila (stack). Este enfoque alternativo evita el uso extensivo de la pila del sistema operativo, que se utiliza en la recursión y puede agotarse en árboles muy profundos. La iterativa es una implementación robusta para árboles de gran tamaño.
¡Sigue practicando y explorando más formas de implementar y adaptar DFS a diferentes problemas! La comprensión y habilidad técnica mejorarán al experimentar con estos conceptos en diversos contextos.
Aportes 14
Preguntas 1
A este punto sería bueno hacer un ejemplo práctica para entender mejor el tema.
Hola 😄, pueden probar el código con el siguiente árbol de ejemplo.
.
.
dfsBin.js:
const dfs = function (raiz, valorAEncontrar) {
if (!raiz) {
// si raiz es null o undefined, termina la función
return null;
}
console.log("En este momento estoy en el nodo, el valor " + raiz.valor);
if (raiz.valor === valorAEncontrar) {
console.log("Econtré el valor!!! ");
return raiz;
}
var izquierda = dfs(raiz.izquierda, valorAEncontrar);
var derecha = dfs(raiz.derecha, valorAEncontrar);
if (izquierda != null) {
return izquierda;
}
if (derecha != null) {
return derecha;
}
return null;
};
//Creación del árbol como objeto
let nodos = {
valor: 25,
izquierda: {
valor: 10,
izquierda: {
valor: 8,
izquierda: {
valor: 6,
izquierda: {
valor: 1,
izquierda: null,
derecha: null,
},
derecha: {
valor: 7,
izquierda: null,
derecha: null,
},
},
derecha: null,
},
derecha: {
valor: 13,
izquierda: null,
derecha: {
valor: 15,
izquierda: null,
derecha: null,
},
},
},
derecha: {
valor: 40,
izquierda: {
valor: 30,
izquierda: {
valor: 26,
izquierda: null,
derecha: null,
},
derecha: null,
},
derecha: {
valor: 42,
izquierda: null,
derecha: {
valor: 49,
izquierda: {
valor: 45,
izquierda: null,
derecha: null,
},
derecha: {
valor: 51,
izquierda: null,
derecha: null,
},
},
},
},
};
// Probar la función dfs
let nodoEncontrado = dfs(nodos, 30);
console.log("\nEl valor encontrado es:\n");
console.log(nodoEncontrado);
.
Pueden ejecutarlo por la terminal, desde el directorio donde tienen guardado el archivo, ejecutando:
node dfsBin.js
Seria bueno en este caso, mostrar como es el objeto que se va a recorrer con eso queda un poco ilulstrado
Estaria bueno primero tener un video de como es la estructura de una grafo, como se implementa, que propiedades y metodos tiene para entender mejor el algoritmo
# Función para realizar DFS en un grafo dado
def dfs(graph, node, visited):
# Marcar el nodo actual como visitado
visited[node] = True
print("Visitando nodo:", node)
# Recorrer todos los nodos adyacentes al nodo actual
for neighbor in graph[node]:
if not visited[neighbor]:
# Si el vecino no ha sido visitado, realizar DFS en él
dfs(graph, neighbor, visited)
# Ejemplo de uso
if __name__ == "__main__":
# Grafo representado como listas de adyacencia
graph = {
0: [1, 2],
1: [0, 3, 4],
2: [0, 5],
3: [1],
4: [1],
5: [2]
}
# Inicializar un arreglo para llevar un seguimiento de los nodos visitados
visited = [False] * len(graph)
# Realizar DFS desde el nodo 0
dfs(graph, 0, visited)
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?