Introducción
¿Qué es un grafo?
¿Qué es un árbol?
¿Qué es recursión?
Aplicaciones reales de grafos y árboles
Formas de representar un grafo
DFS
Análisis de DFS: algoritmo de búsqueda en profundidad
Programando DFS de forma recursiva
Otras formas de programar DFS
Recorridos y profundidad de un Árbol
Sum Root to Leaf Numbers: análisis del problema
Solución de Sum Root to Leaf Numbers
Playground: Sum Root to Leaf Numbers
Programando Sum Root to Leaf Numbers en Golang
Number of Islands: análisis del problema
Solución de Number of Islands
Playground: Number of Islands
Programando Number of Islands en Python
Ejercicios recomendados de DFS
Ejercicios resueltos de DFS
BFS
Análisis de BFS: algoritmo de búsqueda en anchura
Programando BFS con Python
Minimum Knights Moves (movimientos de caballo en ajedrez): análisis del problema
Solución de Minimum Knights Moves
Playground: Minimum Knights Moves
Programando Minimum Knights Moves con Python
Rotting Oranges: análisis del problema
Solución de Rotting Oranges
Playground: Rotting Oranges
Rotting Oranges con Java
Shortest Bridge Between Islands: análisis del problema
Solución de Shortest Bridge Between Islands
Playground: Shortest Bridge Between Islands
Programando Shortest Bridge Between Islands con Python
Ejercicios recomendados de BFS
Ejercicios resueltos de BFS
Backtrack
Algoritmo de Backtrack
Letter Combinations of a Phone Number: análisis del problema
Solución de Letter Combinations of a Phone Number
Programando Letter Combinations of a Phone Number con C++
Playground: Letter Combinations of a Phone Number
Restore IP Addresses: análisis del problema
Programando Restore IP Addresses con C++
Playground: Restore IP Addresses
Word Search: análisis del problema
Solución de Word Search
Playgrund: Word Search
Programando Word Search JavaScript
Reto: N Queens Puzzle
Ejercicios recomendados de Backtrack
Ejercicios resueltos de Backtrack
Próximos pasos
¿Qué otros algoritmos y tipos de grafos puedes aprender?
¿Quieres más cursos avanzados de algoritmos?
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Convierte tus certificados en títulos universitarios en USA
Antes: $249
Paga en 4 cuotas sin intereses
Termina en:
Camila Londoño
Aportes 13
Preguntas 0
Solución en java
class Solution {
static int total;
public int sumNumbers(TreeNode root) {
total = 0;
dfs(root, 0);
return total;
}
static void dfs(TreeNode root, int parent) {
int value = (parent * 10) + root.val;
if(root.left == null && root.right == null){
total += value;
return;
}
if(root.left != null) {
dfs(root.left, value);
}
if(root.left != null) {
dfs(root.right, value);
}
return;
}
}
Solución en c++
#include <iostream>
#include <vector>
using namespace std;
struct Node
{
int value;
vector<Node> childrens;
};
int dfs(const Node &root, int path, int &sum)
{
if (root.childrens.size() == 0)
{
sum += path;
return sum;
}
for (int i = 0; i < root.childrens.size(); i++)
{
dfs(root.childrens[i], path * 10 + root.childrens[i].value, sum);
}
return sum;
}
int main()
{
// root
Node root;
root.value = 1;
// child1
Node child1;
child1.value = 2;
// grandchild1
Node grandchild1;
grandchild1.value = 4;
// grandchild2
Node grandchild2;
grandchild2.value = 1;
child1.childrens.push_back(grandchild1);
child1.childrens.push_back(grandchild2);
// child2
Node child2;
child2.value = 3;
root.childrens.push_back(child2);
root.childrens.push_back(child1);
int result = 0;
dfs(root, root.value, result);
cout << result << endl;
return 0;
}
Esta es mi solución en Kotlin:
data class Node(
val value: Int,
val children: List<Node>? = null,
)
fun main() {
val root = Node(
value = 1,
children = listOf(
Node(
value = 3,
children = listOf(
Node(value = 5),
Node(value = 8),
)
),
Node(
value = 7,
children = listOf(
Node(1)
)
)
)
)
val total = dfs(root, "")
println("The sum is: $total")
}
fun dfs(node: Node, number: String): Int {
if (node.children == null) {
return "$number${node.value}".toInt()
}
var total = 0
node.children.forEach {
total += dfs(it, "$number${node.value}")
}
return total
}
Esta es mi solucion en Node.js
var total = 0;
const sumNumbers = (root) => {
if (nodeIsEmpty(root)) return 0;
let sumTxt = String(root.content);
dfs(root, sumTxt);
console.log("Total ", total);
}
const dfs = (node, sumTxt) => {
if (nodeIsEmpty(node.right) && nodeIsEmpty(node.left)) {
total = total + Number(sumTxt);
};
calculateSum(node.right, sumTxt, total);
calculateSum(node.left, sumTxt, total);
}
const nodeIsEmpty = (node) => {
return node == undefined || Object.keys(node).length == 0;
}
const calculateSum = (node, sumTxt) => {
if (nodeIsEmpty(node)) return;
dfs(node, sumTxt + String(node.content));
}
const root = {
content: 1,
visited: false,
right : {
content: 3,
visited: false,
right : {
content: 5,
visited: false,
right: {},
left: {}
},
left: {
content: 8,
visited: false,
right: {},
left: {}
}
},
left: {
content: 7,
visited: false,
right: {},
left: {
content: 1,
visited: false,
right: {},
left: {}
}
}
}
sumNumbers(root);
Despues de pensar un poco lo logre
class Response:
total = 0
def __init__(self, total):
self.total = total
def dfs(self, node, valor_actual):
parcial = valor_actual + str(node.valor)
if node.izquierda is None and node.derecha is None:
self.total = self.total + int(parcial)
if node.derecha is not None:
self.dfs(node.derecha, parcial)
if node.izquierda is not None:
self.dfs(node.izquierda, parcial)
def sum_numbers(node, valor_actual=''):
response = Response(0)
response.dfs(node, valor_actual)
return response.total
Hola 😄, les comparto la solución en Golang junto a la prueba.
.
solSRLN.go:
package main
import (
"fmt"
"strconv"
)
// Definición de la estructura del árbol
type Nodo struct {
Val int
izquierda *Nodo
derecha *Nodo
}
// Creación del árbol
var arbolSRLN = &Nodo{
Val: 1,
izquierda: &Nodo{
Val: 3,
izquierda: &Nodo{
Val: 5,
izquierda: nil,
derecha: nil,
},
derecha: &Nodo{
Val: 8,
izquierda: nil,
derecha: nil,
},
},
derecha: &Nodo{
Val: 7,
izquierda: nil,
derecha: &Nodo{
Val: 1,
izquierda: nil,
derecha: nil,
},
},
}
// Función que realiza la suma de los números del árbol
func sumNumbers(raiz *Nodo) int {
if raiz == nil {
return 0
}
total := 0
dfs(raiz, "", &total)
return total
}
// Función DFS recursiva para recorrer el árbol y sumar los números
func dfs(raiz *Nodo, caminoActual string, sumaTotal *int) {
if raiz.izquierda == nil && raiz.derecha == nil {
valor, _ := strconv.Atoi(caminoActual + strconv.Itoa(raiz.Val))
*sumaTotal += valor
}
if raiz.izquierda != nil {
dfs(raiz.izquierda, caminoActual+strconv.Itoa(raiz.Val), sumaTotal)
}
if raiz.derecha != nil {
dfs(raiz.derecha, caminoActual+strconv.Itoa(raiz.Val), sumaTotal)
}
}
func main() {
fmt.Println(sumNumbers(arbolSRLN))
}
.
Output:
Mi solucion en Python :
def sum_root_regresive(root):
left = sum_function(root, 'left')
right = sum_function(root, 'right')
return left + right
def sum_function(root, direction, str_queue = ''):
if root.get(direction) == None:
return int(str_queue + str(root['value']))
return sum_function(root[direction], direction, str_queue + str(root['value']))
Mi solución recursiva en python:
def sum_numbers(root: Node, start_number_with: str = '') -> int:
if root.left is None and root.right is None:
return int(start_number_with + str(root.value))
left = 0
right = 0
if root.left is not None:
left = sum_numbers(root.left, start_number_with + str(root.value))
if root.right is not None:
right = sum_numbers(root.right, start_number_with + str(root.value))
return left + right
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?