Saltar al contenido
Juan Carlos Angulo

Árboles binarios: Guía técnica de estructuras y algoritmos de búsqueda

JU
Juan Carlos Angulo

Ingeniero de Software y Consultor SEO Técnico

· 15 min de lectura

Para mí, los árboles binarios son de las estructuras de datos más útiles que existen. Cada nodo tiene como máximo dos hijos, y esa simple regla jerárquica alcanza para organizar información de forma muy eficiente. Los uso todo el tiempo: para optimizar búsquedas y ordenaciones, para construir índices en diseño de bases de datos o para representar expresiones dentro de un compilador. Entender bien sus tipos y operaciones es la base de Algoritmos y Estructuras de Datos, y abre la puerta a soluciones elegantes para problemas que de otra forma serían un dolor de cabeza.

En corto: un árbol binario organiza datos de forma jerárquica, cada nodo con hasta dos hijos, y eso te da búsquedas, inserciones y eliminaciones en O(log N) cuando usas un Árbol Binario de Búsqueda (BST). Los árboles balanceados (AVL, rojinegros) evitan que esa eficiencia se degrade a O(N). Y los recorridos (preorden, inorden, postorden, por niveles) son la forma de procesar esos datos, algo que usan desde motores de bases de datos hasta compiladores.

Fundamentos de árboles binarios

Los árboles binarios son la base de otras estructuras de datos más avanzadas. Entender bien su anatomía y cómo operan es el primer paso para usarlos con criterio.

Estructura y nodos de un árbol binario

Un árbol binario es una colección finita de elementos llamados nodos, organizados de forma jerárquica. La forma en que estos nodos se relacionan define la estructura del árbol:

  • Nodo Raíz: Es el nodo superior del árbol y el único que no tiene un nodo padre. Es el punto de entrada para la mayoría de las operaciones.
  • Nodos Hijos (Children Nodes): Son los nodos que dependen directamente de otro nodo (su padre). Cada nodo en un árbol binario puede tener un máximo de dos hijos: un hijo izquierdo y un hijo derecho.
  • Nodo Padre (Parent Node): Un nodo que tiene uno o más nodos hijos.
  • Nodos Hoja (Leaf Nodes) o Nodos Externos: Son los nodos que no tienen ningún hijo. Representan los "extremos" del árbol.
  • Nodos Internos: Son todos los nodos que no son hojas (es decir, tienen al menos un hijo).
  • Rama (Edge): Es la conexión entre un nodo padre y su hijo.
  • Camino (Path): Una secuencia de nodos conectados por ramas.
  • Subárbol (Subtree): Un subárbol es un nodo y todos sus descendientes. Cada hijo de un nodo raíz es la raíz de un subárbol. Un nodo tiene un subárbol izquierdo y un subárbol derecho.
  • Grado de un nodo: El número de hijos que tiene un nodo. En un árbol binario, el grado máximo es 2.

Propiedades esenciales de los árboles binarios

Estas son las características que definen qué tan eficiente y aplicable resulta un árbol binario:

  • Altura (Height) del Árbol: Es la longitud del camino más largo desde el nodo raíz hasta un nodo hoja. Un árbol con un solo nodo tiene altura 0. La altura es un factor clave en la complejidad de las operaciones.
  • Nivel (Level) de un Nodo: La distancia de un nodo desde la raíz. La raíz está en el nivel 0. Los hijos de un nodo en el nivel k están en el nivel k+1.
  • Profundidad (Depth) de un Nodo: Es sinónimo de su nivel, la longitud del camino desde la raíz hasta ese nodo.
  • Número Máximo de Nodos: En un árbol binario con altura h, el número máximo de nodos es 2^(h+1) - 1.
  • Relación entre Nodos:

Memoria dinámica y manejo eficiente en árboles

La implementación de árboles binarios se basa fundamentalmente en el uso de memoria dinámica y punteros (o referencias en lenguajes de alto nivel). Cada nodo se asigna dinámicamente y contiene el dato y punteros a sus hijos izquierdo y derecho.

  • Flexibilidad: Permite que la estructura crezca o se encoja según sea necesario, adaptándose al volumen de datos.
  • Eficiencia Espacial: Idealmente, solo se utiliza la memoria necesaria para los nodos existentes. Sin embargo, el almacenamiento de punteros puede añadir una sobrecarga significativa.
  • Contraste con Arrays: A diferencia de las implementaciones basadas en arrays (como los heaps binarios), donde la memoria es contigua, los árboles basados en punteros pueden tener nodos dispersos en memoria, lo que podría afectar el rendimiento de la caché pero ofrece mayor flexibilidad en la reestructuración.

Tipos principales de árboles binarios

Existen diversas clasificaciones y variantes de árboles binarios, cada una con propiedades estructurales que optimizan ciertos escenarios y operaciones.

Árbol binario completo y sus características

Un árbol binario completo es aquel en el que todos los niveles están completamente llenos, excepto quizás el último, y en este último nivel, todos los nodos están tan a la izquierda como sea posible.

  • Eficiencia de Almacenamiento: Son ideales para implementaciones basadas en arrays (como los heaps), ya que no hay "huecos" en la representación, lo que los hace muy compactos.
  • Altura Logarítmica: Para N nodos, la altura de un árbol binario completo es log₂N. Esto asegura que las operaciones como la búsqueda sean eficientes.

Otros tipos comunes de árboles binarios

  • Árbol Binario Lleno (Full Binary Tree): Cada nodo tiene cero o dos hijos. No hay nodos con un solo hijo.
  • Árbol Binario Perfecto (Perfect Binary Tree): Un árbol binario que es tanto lleno como completo. Todos los nodos internos tienen dos hijos y todas las hojas están en el mismo nivel.
  • Árbol Binario Sesgado o Degenerado (Skewed/Degenerate Binary Tree): Un árbol en el que cada nodo tiene solo un hijo (ya sea izquierdo o derecho). En este caso, el árbol se comporta como una lista enlazada, y la altura es N, lo que anula las ventajas de la búsqueda logarítmica.

Árbol binario equilibrado: diferencias y ventajas

Un árbol binario equilibrado es aquel que mantiene su altura lo más pequeña posible (idealmente O(log N)), evitando así la degeneración a un árbol sesgado.

  • Rendimiento Óptimo: Garantiza que las operaciones de búsqueda, inserción y eliminación mantengan una complejidad temporal de O(log N) en el peor caso.
  • Contraste con Árboles Desequilibrados: Un árbol desequilibrado puede hacer que las operaciones se degraden a O(N), comparable a una búsqueda lineal. El balanceo es clave para mantener la eficiencia de la estructura.

Árboles AVL y su balanceo automático

Los árboles AVL (Adelson-Velsky y Landis) son los primeros árboles binarios de búsqueda auto-equilibrados.

  • Factor de Balanceo: Para cada nodo, la diferencia de altura entre su subárbol izquierdo y su subárbol derecho (factor de balanceo) no puede ser mayor a 1 (es decir, -1, 0, o 1).
  • Rotaciones: Tras cada inserción o eliminación, si el factor de balanceo se rompe, el árbol realiza una o más rotaciones (simple o doble, izquierda o derecha) para restaurar la propiedad AVL.
  • Complejidad: Todas las operaciones (búsqueda, inserción, eliminación) tienen una complejidad de O(log N) en el peor caso, garantizando un rendimiento consistente.

Árbol rojo-negro: estructura y reglas de color

Los árboles Rojo-Negro son otra forma popular de árbol binario de búsqueda auto-equilibrado, menos estrictos en su balanceo que los AVL pero igualmente eficientes.

  • Reglas de Color: Cada nodo se colorea de rojo o negro, siguiendo cinco propiedades que garantizan que el camino más largo desde la raíz a cualquier hoja no sea más del doble de largo que el camino más corto.
  • Ventajas: A menudo son preferidos sobre los AVL en implementaciones prácticas (como en la std::map de C++ o HashMap de Java hasta ciertas versiones) porque las operaciones de inserción y eliminación pueden requerir menos rotaciones en promedio, haciéndolas ligeramente más rápidas en estas operaciones, aunque la búsqueda es marginalmente más lenta que en AVL.
  • Complejidad: Todas las operaciones tienen una complejidad de O(log N) en el peor caso.

Árboles binarios de búsqueda (BST - binary search trees)

Los BST son un tipo especial de árbol binario que organiza los datos de una manera muy específica para permitir búsquedas eficientes. Son la base de muchas aplicaciones donde la recuperación rápida de datos es clave.

Conceptos básicos y reglas de ordenación

La propiedad fundamental de un Árbol Binario de Búsqueda es la propiedad de ordenación:

  • Para cualquier nodo, todos los valores en su subárbol izquierdo son menores que el valor del nodo.
  • Para cualquier nodo, todos los valores en su subárbol derecho son mayores (o iguales, dependiendo de la implementación) que el valor del nodo.

Esta regla simple es la que habilita la eficiencia de las operaciones de búsqueda, inserción y eliminación, ya que en cada paso se puede descartar la mitad relevante del árbol.

Operaciones fundamentales: búsqueda, inserción y eliminación

Las operaciones clave en un BST aprovechan su propiedad de ordenación para una eficiencia superior a las listas lineales.

1. proceso de búsqueda eficiente (o(h))

  • Inicio: Comienza en el nodo raíz.
  • Comparación: Compara el valor buscado con el valor del nodo actual.
  • Repetición: Repite los pasos anteriores hasta encontrar el valor o alcanzar un nodo NULL (lo que significa que el elemento no está en el árbol).

Pseudo-código para búsqueda:

typescript
funcion buscar(nodo, valor)
    si nodo es NULL o nodo.valor es igual a valor
        retornar nodo
    si valor < nodo.valor
        retornar buscar(nodo.izquierda, valor)
    sino
        retornar buscar(nodo.derecha, valor)

La complejidad temporal es O(h), donde h es la altura del árbol. En un árbol balanceado, h = log N, por lo que es O(log N). En un árbol sesgado, h = N, por lo que es O(N).

2. inserción de nodos con mantenimiento del orden (o(h))

  • Localización: Realiza una búsqueda para encontrar la posición correcta donde el nuevo nodo debe ser insertado como un nodo hoja.
  • Inserción: Una vez encontrada la posición (un puntero NULL), se crea el nuevo nodo y se enlaza al padre correspondiente.

Pseudo-código para inserción:

typescript
funcion insertar(nodo, valor)
    si nodo es NULL
        retornar nuevo Nodo(valor)
    si valor < nodo.valor
        nodo.izquierda = insertar(nodo.izquierda, valor)
    sino
        nodo.derecha = insertar(nodo.derecha, valor)
    retornar nodo

La complejidad temporal es O(h).

3. eliminación y reestructuración del árbol (o(h))

La eliminación es la operación más compleja y tiene tres casos principales:

  • Nodo Hoja: Si el nodo a eliminar no tiene hijos, simplemente se elimina.
  • Nodo con un Hijo: El nodo se reemplaza por su único hijo, y el hijo se enlaza al padre del nodo eliminado.
  • Nodo con Dos Hijos: Este es el caso más complicado. Se debe encontrar un sucesor inorden (el nodo con el valor más pequeño en el subárbol derecho) o un predecesor inorden (el nodo con el valor más grande en el subárbol izquierdo) para reemplazar el nodo eliminado. El sucesor inorden se copia al nodo a eliminar, y luego el sucesor (que ahora es redundante) se elimina de su posición original (lo que reduce el problema a uno de los dos primeros casos).

Pseudo-código para eliminación (simplificado para el caso de dos hijos, buscando sucesor):

typescript
funcion encontrarMinimo(nodo)
    mientras nodo.izquierda no es NULL
        nodo = nodo.izquierda
    retornar nodo

funcion eliminar(nodo, valor)
    si nodo es NULL
        retornar NULL

    si valor < nodo.valor
        nodo.izquierda = eliminar(nodo.izquierda, valor)
    sino si valor > nodo.valor
        nodo.derecha = eliminar(nodo.derecha, valor)
    sino // Valor encontrado
        si nodo.izquierda es NULL y nodo.derecha es NULL // Caso 1: Nodo hoja
            retornar NULL
        sino si nodo.izquierda es NULL // Caso 2: Un hijo (derecho)
            temp = nodo.derecha
            liberar nodo
            retornar temp
        sino si nodo.derecha es NULL // Caso 2: Un hijo (izquierdo)
            temp = nodo.izquierda
            liberar nodo
            retornar temp
        sino // Caso 3: Dos hijos
            temp = encontrarMinimo(nodo.derecha) // Buscar sucesor inorden
            nodo.valor = temp.valor // Copiar valor
            nodo.derecha = eliminar(nodo.derecha, temp.valor) // Eliminar sucesor original
    retornar nodo

La complejidad temporal es O(h).

Desventajas del BST no balanceado: la importancia del balanceo

La eficiencia de un BST depende críticamente de su altura. Si las inserciones se realizan en un orden secuencial (por ejemplo, 1, 2, 3, 4, 5), el BST degenera en un árbol sesgado, comportándose como una lista enlazada, donde h = N. En este escenario, la complejidad de todas las operaciones (búsqueda, inserción, eliminación) se degrada a O(N), perdiendo todas las ventajas de la estructura. Es por esto que los árboles binarios de búsqueda balanceados (AVL, Rojo-Negro) son tan importantes en la práctica.

Implementación práctica y recursos

La implementación de árboles binarios de búsqueda es un ejercicio clásico para consolidar la comprensión de punteros, recursión y gestión de casos.

  • Java/Python/C++: Estos lenguajes ofrecen un buen entorno para implementar árboles debido a su manejo de objetos y referencias/punteros. Un ejemplo en Java, aunque sea pseudo-código, ayuda a visualizar la lógica.
  • Herramientas de Visualización Online: Plataformas como VisuAlgo, Data Structure Visualizations o BinarySearchTree.io permiten crear y manipular BSTs visualmente, lo que es invaluable para entender cómo funcionan las operaciones de balanceo y los recorridos.

Métodos de recorrido en árboles binarios (DFS y BFS)

Los recorridos de árboles son algoritmos que visitan cada nodo de un árbol exactamente una vez, siguiendo un orden específico. Son esenciales para procesar, copiar o serializar los datos del árbol. Se dividen principalmente en dos categorías: búsqueda en profundidad (DFS) y búsqueda en amplitud (BFS).

Búsqueda en profundidad (DFS - depth-first search)

Los recorridos DFS exploran tan profundo como sea posible a lo largo de cada rama antes de retroceder. Incluyen Preorden, Inorden y Postorden. La complejidad temporal para todos los DFS es O(N) (donde N es el número de nodos) porque visitan cada nodo una vez. La complejidad espacial es O(h) debido a la pila de llamadas recursivas, donde h es la altura del árbol.

1. recorrido en preorden (node -> left -> right)

  • Secuencia: Visita el nodo actual, luego recorre el subárbol izquierdo, finalmente recorre el subárbol derecho.
  • Pseudo-código:
  • Usos Prácticos:

2. recorrido en inorden (left -> node -> right)

  • Secuencia: Recorre el subárbol izquierdo, luego visita el nodo actual, finalmente recorre el subárbol derecho.
  • Pseudo-código:
  • Importancia en BSTs: Cuando se aplica a un Árbol Binario de Búsqueda (BST), el recorrido inorden visita los nodos en orden ascendente de sus valores, lo que lo convierte en un método eficiente para obtener una lista ordenada de elementos o para validar el orden de un BST.

3. recorrido en postorden (left -> right -> node)

  • Secuencia: Recorre el subárbol izquierdo, luego recorre el subárbol derecho, finalmente visita el nodo actual.
  • Pseudo-código:
  • Usos Prácticos:

Búsqueda en amplitud (BFS - breadth-first search) o recorrido por niveles

El recorrido por niveles (Level-Order Traversal) explora el árbol nivel por nivel, de izquierda a derecha. Utiliza una cola (queue) para gestionar los nodos a visitar.

  • Secuencia: Visita todos los nodos del nivel 0 (raíz), luego todos los nodos del nivel 1, y así sucesivamente.
  • Pseudo-código:
  • Complejidad: O(N) tiempo, O(W) espacio (donde W es el ancho máximo del árbol, que en el peor caso puede ser O(N)).
  • Usos Prácticos:

Impacto de los árboles binarios en el rendimiento y diseño de sistemas

Los árboles binarios, y sus primos más generales los B-trees, no son curiosidad académica. Están debajo de un montón de sistemas críticos, y su eficiencia se nota directamente en el rendimiento, la escalabilidad y la fiabilidad del software que corre encima.

Bases de datos e indexación

Los árboles son el corazón de la mayoría de los índices de bases de datos (SQL vs NoSQL y NoSQL).

  • B-trees y B+ trees: Aunque no son estrictamente binarios, son generalizaciones que permiten más de dos hijos por nodo y están optimizados para sistemas de almacenamiento en disco. Permiten búsquedas, inserciones y eliminaciones en O(log N) operaciones de disco, lo cual es vital para el rendimiento de las consultas en bases de datos masivas.
  • Recuperación Rápida: Sin estas estructuras, una base de datos tendría que realizar búsquedas lineales (escaneos completos de tabla), lo que sería inviable para millones o miles de millones de registros.

Sistemas de archivos y sistemas operativos

  • Organización de Directorios: Los sistemas de archivos utilizan estructuras tipo árbol para organizar directorios y archivos de forma jerárquica, permitiendo un acceso eficiente a los datos.
  • Gestión de Memoria: Algunos sistemas operativos utilizan árboles binarios (o sus variantes) para gestionar bloques de memoria disponibles.

Compiladores y procesamiento de lenguajes

  • Árboles Sintácticos Abstractos (AST - Abstract Syntax Trees): Los compiladores y los intérpretes de lenguajes de programación utilizan ASTs, que son estructuras de árbol, para representar la estructura sintáctica del código fuente. Esto facilita el análisis, la optimización y la generación de código.
  • Evaluación de Expresiones: Los árboles de expresión se utilizan para representar y evaluar expresiones matemáticas o lógicas, como se ve en el uso de los recorridos Preorden y Postorden.

Algoritmos de enrutamiento y redes

  • Algoritmos de Enrutamiento: En redes de computadoras, a veces se utilizan árboles de expansión (spanning trees) o árboles de rutas para determinar los caminos más eficientes para el flujo de datos.
  • Jerarquías DNS: La estructura del Sistema de Nombres de Dominio (DNS) es inherentemente jerárquica y similar a un árbol, permitiendo la resolución eficiente de nombres de dominio a direcciones IP.

Representación de jerarquías y toma de decisiones

  • Árboles Genealógicos: Representan relaciones familiares.
  • Árboles de Decisión: Utilizados en inteligencia artificial y aprendizaje automático para modelar decisiones y sus posibles resultados.
  • Estructuras Organizacionales: Organigramas de empresas.

Que los árboles binarios estén en todas partes de la informática moderna dice mucho de lo bien que funcionan.

Aplicaciones y ejercicios prácticos con árboles binarios

La teoría se afianza con la práctica. Los árboles binarios son un campo fértil para aplicar conocimientos de estructuras de datos y algoritmos, resolviendo problemas reales.

Uso en estructuras de datos avanzadas y programación eficiente

Los árboles binarios son los bloques de construcción para:

  • Mapas y Conjuntos: En muchos lenguajes, las implementaciones de Map (diccionarios, tablas de símbolos) o Set se basan en árboles binarios de búsqueda auto-balanceados (como Rojo-Negros) para garantizar operaciones de O(log N).
  • Colas de Prioridad (Heaps): Un heap binario es un árbol binario completo (implementado típicamente en un array) que cumple la propiedad de heap, esencial para algoritmos como Dijkstra o la ordenación Heap Sort.
  • Algoritmos de Inteligencia Artificial: Desde algoritmos de búsqueda (A*, minimax) en juegos hasta la representación de ontologías y sistemas expertos.

Manejo de datos ordenados y optimización de memoria

La capacidad de los BST para mantener los datos ordenados de forma natural los hace invaluables:

  • Acceso Eficaz: Permite búsquedas rápidas, encontrar el mínimo/máximo, o el predecesor/sucesor de un elemento en O(log N).
  • Optimización de Memoria: Los árboles balanceados evitan el uso excesivo de memoria para la pila de recursión y aseguran que los recursos se utilicen de manera proporcional al logaritmo del tamaño de los datos.

Ejercicios clave para reforzar conceptos de árboles binarios

La implementación manual de estas estructuras y algoritmos es la mejor forma de aprender:

Interpretación y solución de problemas avanzados con árboles binarios

Los árboles binarios son herramientas poderosas para abordar problemas más complejos en entrevistas de codificación y en el diseño de sistemas:

  • Encontrar el k-ésimo elemento más pequeño: Usando el recorrido inorden o extendiendo la estructura del nodo con un contador de hijos.
  • Caminos con sumas objetivo: Buscar un camino desde la raíz a una hoja que sume un valor específico.
  • Convertir un BST en una lista doblemente enlazada: Una aplicación avanzada del recorrido inorden.
  • Problemas de ancestros comunes: Encontrar el ancestro común más bajo (LCA) entre dos nodos.

Dominar los árboles binarios no es solo aprender una estructura de datos más. Es entender cómo organizar y manipular información de forma eficiente, algo que vas a usar constantemente como ingeniero de software.

Preguntas frecuentes sobre árboles binarios

¿Cuál es la diferencia clave entre un árbol binario y un BST?

Un árbol binario es una estructura donde cada nodo tiene como máximo dos hijos. Un BST (Árbol Binario de Búsqueda) es un tipo específico de árbol binario que añade una propiedad de ordenación: para cada nodo, todos los valores en su subárbol izquierdo son menores que él, y todos los valores en su subárbol derecho son mayores (o iguales). Esta propiedad es lo que permite las búsquedas eficientes en O(log N).

¿Cuándo debo usar un árbol binario en lugar de un array o una lista enlazada?
  • Arrays: Son excelentes para acceso por índice O(1) y memoria contigua, pero inserciones/eliminaciones en el medio son O(N).
  • Listas Enlazadas: Inserciones/eliminaciones O(1) si ya tienes el puntero al lugar, pero el acceso por índice es O(N).
  • Árboles Binarios (especialmente BSTs balanceados): Ofrecen un equilibrio excelente, con búsquedas, inserciones y eliminaciones en O(log N). Son ideales cuando necesitas mantener datos ordenados y realizar estas operaciones eficientemente sin la lentitud O(N) de las listas, ni las limitaciones de los arrays.
¿Por qué es importante balancear un árbol binario de búsqueda?

Sin balanceo, un BST puede degenerar en un árbol sesgado (parecido a una lista enlazada) si los datos se insertan en un orden secuencial o casi ordenado. Cuando esto sucede, la altura del árbol se convierte en O(N), y todas las operaciones (búsqueda, inserción, eliminación) se degradan de O(log N) a O(N), perdiendo la principal ventaja del BST. Los árboles balanceados (AVL, Rojo-Negro) garantizan una altura logarítmica, manteniendo la eficiencia.

¿Qué otros tipos de árboles existen además de los binarios?

Existen muchos otros tipos de árboles, a menudo generalizaciones o especializaciones:

  • Árboles N-arios: Nodos pueden tener más de dos hijos (e.g., árboles de directorios).
  • B-trees y B+ trees: Optimizados para almacenamiento en disco, usados en índices de bases de datos.
  • Árboles de segmento (Segment Trees) y Árboles Fenwick (BIT): Para consultas eficientes en rangos.
  • Árboles Trie (Prefijo): Para búsqueda eficiente de palabras basada en prefijos (e.g., autocompletado).
  • Árboles de sintaxis abstracta (AST): Usados en compiladores.
¿Son los árboles binarios útiles para todos los problemas de búsqueda?

Los árboles binarios, particularmente los BSTs balanceados, son excelentes para problemas de búsqueda donde los datos son dinámicos (se insertan y eliminan). Sin embargo, para datos estáticos y muy grandes, las tablas hash pueden ofrecer búsquedas promedio de O(1), y para datos que no requieren ordenación, los arrays pueden ser más simples. La elección depende siempre de las características del problema y los requisitos de rendimiento.

JU
Juan Carlos Angulo

Ingeniero de Software y Consultor SEO Técnico

Soy Juan Carlos Angulo, Ingeniero de Software y Consultor SEO Técnico freelance con sede en Lima, Perú. A lo largo de más de cuatro años de experiencia profesional me he especializado en la intersección entre el desarrollo de software y la optimización para motores de búsqueda. Mi trabajo combina la auditoría técnica SEO (rastreo, indexabilidad, Core Web Vitals, Schema.org y datos estructurados) con el desarrollo full-stack usando Next.js y Payload CMS. Ayudo a empresas a mejorar su visibilidad orgánica con correcciones directas a nivel de código, sin intermediarios. Construyo y mantengo juan-tech.com, un blog técnico bilingüe para desarrolladores y profesionales de tecnología en Latinoamérica y España.

Esto mismo, aplicado a sitios reales

Soy ingeniero de software y consultor SEO técnico. Estos fundamentos son la mitad del trabajo; la otra mitad es lo que pasa cuando se aplican sobre un sitio con usuarios y con tráfico que perder.

  • Casos con clics, impresiones y posiciones reales de Search Console
  • Cliente anonimizado en todos: se muestran resultados, nunca identidad