Las 4 Estructuras de Datos que Te Harán Destacar en Entrevistas Senior

Las 4 Estructuras de Datos que Te Harán Destacar en Entrevistas Senior

En la primera parte cubrimos las 5 estructuras fundamentales que aparecen en el 70% de las entrevistas. Ahora vamos un nivel más arriba.

Si estás aplicando a roles senior en empresas como MercadoLibre, Nubank, Cornershop, o buscando posiciones remotas en startups de Silicon Valley, estas cuatro estructuras son las que separan a los candidatos buenos de los excelentes.


1. Tree — La Base de la Jerarquía

Un árbol es una estructura jerárquica donde los datos se organizan en nodos conectados por relaciones padre-hijo. A diferencia de las estructuras lineales (arrays, listas), los árboles permiten representar relaciones naturalmente jerárquicas.

Anatomía de un árbol

  • Raíz (root): El nodo superior, punto de entrada al árbol
  • Padre/Hijo: Un nodo que conecta hacia abajo tiene hijos; hacia arriba, un padre
  • Hoja (leaf): Nodo sin hijos
  • Altura: Distancia máxima desde la raíz hasta cualquier hoja

Estructura de un nodo

class TreeNode {
    int data;
    TreeNode left;
    TreeNode right;
    
    TreeNode(int value) {
        this.data = value;
        this.left = null;
        this.right = null;
    }
}

Recorridos fundamentales

Los cuatro recorridos que debes dominar:

Recorrido Orden Uso típico
Inorder Izq → Raíz → Der Obtener elementos ordenados (en BST)
Preorder Raíz → Izq → Der Copiar/serializar el árbol
Postorder Izq → Der → Raíz Eliminar el árbol, evaluar expresiones
Level Order Nivel por nivel BFS, encontrar profundidad mínima

Cuándo usarlo

  • Representar jerarquías (org charts, sistemas de archivos, DOM)
  • Base para estructuras más específicas (BST, Heaps, Tries)
  • Problemas de recursión y divide-and-conquer

Pregunta típica de entrevista

“Encuentra la altura máxima de un árbol binario.”

Estrategia: Recursión. La altura es 1 + max(altura_izquierda, altura_derecha). Caso base: nodo nulo retorna 0.


2. Binary Search Tree (BST) — Búsqueda Ordenada

Un BST es un árbol binario con una propiedad especial: para cada nodo, todos los valores a la izquierda son menores y todos los valores a la derecha son mayores.

Esta propiedad permite búsquedas en O(log n) — similar a búsqueda binaria, pero en estructura de árbol.

La propiedad BST

        15
       /  \
      8    23
     / \   / \
    4  11 17  27

Para el nodo 15: todo a la izquierda (8, 4, 11) es menor; todo a la derecha (23, 17, 27) es mayor.

Operaciones clave

// Búsqueda en BST
TreeNode search(TreeNode root, int target) {
    if (root == null || root.data == target)
        return root;
    
    if (target < root.data)
        return search(root.left, target);
    else
        return search(root.right, target);
}

Complejidad

Operación Promedio Peor caso (desbalanceado)
Búsqueda O(log n) O(n)
Inserción O(log n) O(n)
Eliminación O(log n) O(n)
Inorder O(n) O(n)

Importante: Un BST desbalanceado degenera en una lista enlazada. Por eso existen los árboles auto-balanceados (AVL, Red-Black).

Cuándo usarlo

  • Necesitas datos ordenados con inserción/eliminación frecuente
  • Implementar sets y maps ordenados
  • Problemas que requieren encontrar sucesor/predecesor

Pregunta típica de entrevista

“Valida si un árbol binario es un BST válido.”

Estrategia: Recorrido inorder debe producir secuencia estrictamente creciente. O usar rangos: cada nodo debe estar entre un mínimo y máximo válido.


3. Heap — Priority Queues y Top-K

Un Heap es un árbol binario completo que mantiene la propiedad de heap: cada padre es mayor (max-heap) o menor (min-heap) que sus hijos.

La magia del heap: acceder al elemento máximo o mínimo en O(1), e insertar/eliminar en O(log n).

Min-Heap vs Max-Heap

  • Min-Heap: El padre siempre es menor o igual que sus hijos. La raíz es el mínimo.
  • Max-Heap: El padre siempre es mayor o igual que sus hijos. La raíz es el máximo.

Implementación con array

Los heaps se implementan eficientemente con arrays (sin punteros):

Para el índice i:
  - Hijo izquierdo: 2*i + 1
  - Hijo derecho:   2*i + 2
  - Padre:          (i - 1) / 2
// En Java, usa PriorityQueue
PriorityQueue<Integer> minHeap = new PriorityQueue<>();
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());

minHeap.offer(5);    // insertar
int min = minHeap.peek();   // ver mínimo (O(1))
int removed = minHeap.poll(); // extraer mínimo (O(log n))

Complejidad

Operación Tiempo
Peek (ver raíz) O(1)
Insert O(log n)
Extract (remover raíz) O(log n)
Heapify (construir heap) O(n)

Cuándo usarlo

  • Implementar priority queues
  • Problemas “Top K” o “K-ésimo más grande/pequeño”
  • Algoritmos de grafos (Dijkstra, Prim)
  • Merge de K listas ordenadas

Pregunta típica de entrevista

“Encuentra los K elementos más frecuentes en un array.”

Estrategia: HashMap para contar frecuencias + Min-Heap de tamaño K. O usa un Max-Heap y extrae K veces.


4. Graph — Modelando Relaciones Complejas

Un grafo representa relaciones entre entidades usando vértices (nodos) y aristas (conexiones). Es la estructura más flexible y poderosa para modelar el mundo real.

Tipos de grafos

Tipo Descripción Ejemplo
Dirigido Aristas tienen dirección (A→B) Twitter follows, dependencias
No dirigido Aristas bidireccionales (A—B) Facebook amigos, rutas
Ponderado Aristas tienen peso/costo Mapas con distancias
DAG Dirigido sin ciclos Build systems, scheduling

Representaciones

1. Matriz de adyacencia — O(1) para verificar aristas, O(V²) espacio

int[][] graph = new int[V][V];
graph[u][v] = 1; // arista de u a v

2. Lista de adyacencia — Eficiente en espacio O(V+E), ideal para grafos dispersos

Map<Integer, List<Integer>> graph = new HashMap<>();

void addEdge(int u, int v) {
    graph.computeIfAbsent(u, k -> new ArrayList<>()).add(v);
    graph.computeIfAbsent(v, k -> new ArrayList<>()).add(u); // si es no dirigido
}

Algoritmos esenciales

Algoritmo Propósito Complejidad
BFS Camino más corto (sin pesos), nivel por nivel O(V + E)
DFS Explorar todos los caminos, detectar ciclos O(V + E)
Dijkstra Camino más corto (con pesos positivos) O((V+E) log V)
Topological Sort Ordenar DAG por dependencias O(V + E)

Cuándo usarlo

  • Redes sociales, sistemas de recomendación
  • Rutas y navegación (Google Maps)
  • Dependencias de tareas, builds, cursos
  • Detección de ciclos, componentes conectados

Pregunta típica de entrevista

“Dado un grafo, determina si existe un camino entre dos nodos.”

Estrategia: BFS o DFS desde el nodo origen. Si llegas al destino, existe camino.


Comparativa Rápida

Estructura Fortaleza Complejidad típica
Tree Jerarquías, recursión O(n) recorrido
BST Búsqueda ordenada O(log n) promedio
Heap Acceso al min/max O(1) peek, O(log n) insert
Graph Relaciones complejas O(V + E) traversal

Próximamente: Parte 3

En la tercera y última parte cubriremos las estructuras especializadas que demuestran expertise avanzado:

  • Trie — Autocompletado y búsqueda por prefijos
  • Union-Find — Componentes conectados y detección de ciclos
  • Matrix — Programación dinámica y grafos implícitos

¿Cuál de estas estructuras te ha dado más problemas en entrevistas? Comparte tu experiencia en los comentarios.


Este artículo es parte de la serie “Estructuras de Datos para Entrevistas Técnicas” en yoDEV. Síguenos para no perderte la próxima entrega.