-
Notifications
You must be signed in to change notification settings - Fork 0
Semanas 9 y 10 Arboles
Dominar DFS, BFS y recursión sobre árboles binarios, incluyendo validación de BST, búsqueda de ancestro común y construcción desde recorridos.
| Problema | Patrón | Función | Tests |
|---|---|---|---|
| Maximum Depth of Binary Tree | DFS con retorno | max_depth |
2 |
| Invert Binary Tree | DFS con mutación | invert_tree |
1 |
| Diameter of Binary Tree | DFS con acumulador | diameter_of_binary_tree |
1 |
| Balanced Binary Tree | DFS con centinela | is_balanced |
2 |
| Same Tree | DFS emparejado | is_same_tree |
2 |
| Subtree of Another Tree | DFS + comparación | is_subtree |
2 |
| Binary Tree Level Order Traversal | BFS por niveles | level_order |
1 |
| Validate Binary Search Tree | DFS con límites | is_valid_bst |
3 |
| Lowest Common Ancestor of a BST | Búsqueda guiada por BST | lowest_common_ancestor_bst |
2 |
| Construct Binary Tree from Preorder and Inorder | División recursiva | build_tree_preorder_inorder |
2 |
| Kth Smallest Element in a BST | Inorder iterativo | kth_smallest_bst |
2 |
| Binary Tree Right Side View | BFS por niveles | right_side_view |
2 |
| Path Sum | DFS con objetivo restante | has_path_sum |
2 |
| Path Sum II | DFS con backtracking | path_sum_ii |
2 |
| Serialize and Deserialize Binary Tree | Codificación por niveles |
serialize_tree, deserialize_tree
|
2 |
| Construct Binary Tree from Inorder and Postorder | División recursiva | build_tree_inorder_postorder |
2 |
Se usa cuando cada nodo necesita calcular algo a partir de sus hijos.
Ejemplos:
max_depthdiameter_of_binary_treeis_balanced
En diameter_of_binary_tree, cada llamada devuelve altura, pero actualiza el mejor diámetro visto.
Invariante:
- La altura sube hacia el padre.
- El diámetro se calcula como
left_height + right_height.
En level_order, cada iteración procesa exactamente el tamaño actual de la cola.
Invariante:
- Los nodos en cola al inicio del ciclo pertenecen al mismo nivel.
Cada nodo hereda límites estrictos desde sus ancestros.
Invariante:
- Todo nodo izquierdo debe ser menor que el límite superior.
- Todo nodo derecho debe ser mayor que el límite inferior.
- No basta comparar solo contra el padre.
En build_tree_preorder_inorder:
- Preorder da la raíz.
- Inorder indica cuántos nodos pertenecen al subárbol izquierdo y derecho.
- Un
HashMapde índices evita buscar la raíz en O(n) cada vez.
La variante build_tree_inorder_postorder usa la misma idea, pero toma la raíz desde el final de postorder.
En kth_smallest_bst, un recorrido inorder visita los valores de menor a mayor.
Invariante:
- El stack contiene ancestros pendientes.
- Cada
popproduce el siguiente valor ordenado. - Si
ksale del rango, la respuesta esNone.
has_path_sum y path_sum_ii solo aceptan rutas raíz-hoja.
Invariante:
- Cada llamada resta el valor actual del objetivo restante.
- Una suma intermedia no cuenta si el nodo todavía tiene hijos.
- En
path_sum_ii, el camino se clona solo cuando una hoja completa coincide.
serialize_tree convierte el árbol a una representación compacta por niveles usando # para hijos ausentes.
Ventajas:
- Es fácil de inspeccionar en tests.
- Reutiliza el helper
tree_from_level_orderpara reconstruir. - Evita guardar
Nonefinales que no cambian la estructura.
Se usó:
Option<Rc<RefCell<TreeNode>>>Razón:
-
Rcpermite compartir referencias a nodos. -
RefCellpermite mutación interior controlada. - Esta representación es común en ejercicios de árboles con Rust.
- Comparar BST solo contra el padre.
- Olvidar trim de
Noneal serializar por niveles. - Confundir altura en nodos con diámetro en aristas.
- No clonar enlaces
Rcantes de pasarlos a funciones recursivas. - Recalcular índices de inorder sin mapa auxiliar.
cargo testResultado al cerrar el bloque:
385 passed; 0 failed
El siguiente bloque recomendado es:
- Grafos.
- DFS/BFS en matriz.
- Componentes conectados.
- Ordenamiento topológico.
- Union Find.
Primeros problemas sugeridos:
- Number of Islands.
- Clone Graph.
- Max Area of Island.
- Course Schedule.
- Rotting Oranges.