-
Notifications
You must be signed in to change notification settings - Fork 0
Semanas 7 y 8 Recursion Backtracking y Linked Lists
Joel Alvarez edited this page Jul 12, 2026
·
4 revisions
Construir soluciones recursivas claras, practicar árboles de decisión y manejar listas enlazadas en Rust con ownership explícito.
| Problema | Patrón | Función | Tests |
|---|---|---|---|
| Subsets | Backtracking de decisión | subsets |
2 |
| Permutations | Backtracking con marcadores | permute |
2 |
| Combination Sum | Backtracking con pruning | combination_sum |
2 |
| Generate Parentheses | Backtracking restringido | generate_parentheses |
2 |
| Word Search | DFS en matriz | word_search |
2 |
| Reverse Linked List | Rewire iterativo | reverse_list |
2 |
| Merge Two Sorted Lists | Recursión sobre menor cabeza | merge_two_lists |
2 |
| Linked List Cycle | Fast/slow pointers | has_cycle |
2 |
| Reorder List | Intercalado front/back | reorder_list |
2 |
Backtracking explora un árbol de decisiones y revierte cada decisión al volver.
Preguntas útiles:
- ¿Cuál es el estado actual?
- ¿Qué opciones existen desde este estado?
- ¿Cuál es la condición de parada?
- ¿Qué se debe deshacer al regresar?
En combination_sum, ordenar candidatos permite cortar la rama cuando el candidato ya supera el restante.
Invariante:
- Si
candidate > remaining, los siguientes candidatos también serán demasiado grandes.
En word_search, cada celda puede usarse una sola vez por camino.
Invariante:
- La celda actual se marca como visitada antes de explorar vecinos.
- La celda se restaura al terminar esa rama.
Rust obliga a hacer explícita la propiedad de nodos con Option<Box<ListNode>>.
Ideas clave:
-
take()permite mover elnextsin clonar el nodo. - Reverse list se resuelve moviendo nodos hacia una nueva cabeza.
- Merge list se puede expresar recursivamente eligiendo la cabeza menor.
- Para estudiar ciclos de forma segura, se usó representación de índices:
Vec<Option<usize>>.
- Olvidar hacer
pop()después de una decisión de backtracking. - No clonar el camino antes de guardarlo en resultados.
- Reutilizar celdas en
word_search. - Perder ownership al manipular
Option<Box<ListNode>>. - Intentar modelar ciclos reales con
Boxsin una estrategia segura.
cargo testResultado al cerrar el bloque:
85 passed; 0 failed
El siguiente bloque recomendado es:
- Árboles.
- DFS/BFS por niveles.
- Validación de BST.
- Lowest common ancestor.
Primeros problemas sugeridos:
- Maximum Depth of Binary Tree.
- Invert Binary Tree.
- Diameter of Binary Tree.
- Balanced Binary Tree.
- Binary Tree Level Order Traversal.