Generar un árbol binario completo con una sola fórmula matricial

Un miembro de la comunidad plantea un reto fascinante: dado un número central (ej: 1007), generar automáticamente todo el árbol binario con ancestros arriba y descendientes abajo, en formato visual de cuadro.

La relación entre nodos sigue la lógica de árboles binarios: para un nodo con valor v (restando 1000 para simplificar), sus hijos izquierdo y derecho son v2+1 y v2+2. Los ancestros se calculan con ENTERO(v/2^n).

Nacho ofrece una primera aproximación funcional con LAMBDA + APILARV/APILARH, hardcodeando la estructura del árbol:

``
=LAMBDA(_v;
LET(
_vn; _v - 1000;
APILARH(
APILARV(
1007 + (_vn 8);
"";
1008 + (_vn 8);
...
);
...
)
)
)
`

John lleva la solución a otro nivel con una fórmula matricial pura usando LET + SECUENCIA + ENFILA y aritmética binaria. La clave está en calcular la "profundidad" de cada celda y usar potencias de 2 para derivar los valores:

`
=LET(
x; 1007;
f; SECUENCIA(7);
c; ENFILA(f);
d; ABS(c-4);
p; 8/2^d;
v; x-999;
SI(d;
SI(RESIDUO(f;2p)=p;
999+v2^d+(c>4)2^(d-1)+ENTERO(f/p/2);
""
);
SI(f<5; 999+ENTERO(v/2^(4-f)); "")
)
)
`

John explica la lógica: para el nodo 1007 (simplificado a 7), hijo izquierdo = 72+1 = 15 (→ 1015), hijo derecho = 72+2 = 16 (→ 1016). Los nietos de 1015 serían 152+1 = 31 y 15*2+2 = 32. Los ancestros se obtienen dividiendo entre potencias de 2.

Leo sugiere una extensión con REDUCE para generar el árbol con bucles, permitiendo definir el rango de números y la estructura de forma variable. La aplicación real: redes de mercadeo con estructura binaria (referidos), donde cada persona tiene dos "patas".

El archivo adjunto contiene la función GENERACUADRO` como LAMBDA registrada que genera todo el árbol a partir de un número central.

El reto: dibujar un árbol binario con una fórmula

Un miembro de la comunidad planteó un problema que suena a ejercicio de universidad pero tiene aplicación real: dado un número central (por ejemplo, 1007), generar automáticamente todo su árbol binario —ancestros arriba, descendientes abajo— en formato visual de cuadro.

La relación entre nodos es la de cualquier árbol binario. Para un nodo con un valor dado (restando 1000 para simplificar los cálculos), su hijo izquierdo se obtiene multiplicando por dos y sumando uno, y el derecho multiplicando por dos y sumando dos. Los ancestros se calculan a la inversa, dividiendo por potencias de dos y quedándose con la parte entera. La aplicación práctica más habitual son las redes de mercadeo con estructura binaria, donde cada persona tiene dos "patas" de referidos.

Primera aproximación: LAMBDA con la estructura fija

Nacho ofrece una versión funcional pero "a mano". Con una LAMBDA que recibe el número central y un LET para nombrar el valor normalizado, apila los nodos con APILARV y APILARH, colocando cada valor y cada hueco vacío en su sitio. Funciona perfectamente, pero tiene una limitación: la estructura del árbol está escrita dentro de la fórmula. Si cambia la profundidad, hay que reescribirla entera.

La versión matricial pura: John

John lleva la solución a otro nivel con aritmética binaria y matrices dinámicas, sin codificar la forma del árbol. La idea central es calcular la profundidad de cada celda respecto al centro y usar potencias de dos para derivar el valor que le corresponde. Sus piezas son:

  • Una SECUENCIA genera las filas, y ENFILA su equivalente en horizontal para las columnas.
  • La distancia al centro, calculada con ABS, define la profundidad de cada celda: cuanto más lejos del nodo central, más generaciones de diferencia.
  • La función RESIDUO decide en qué filas aparece un nodo de cada nivel, dejando el resto en blanco.
  • Para los descendientes, el valor se compone a partir del nodo central, un factor de potencia de dos según la profundidad y un desplazamiento cuando la columna cae a la derecha del centro.
  • Para los ancestros, cuando la fila queda por encima del nodo central, el valor se obtiene con ENTERO dividiendo por la potencia de dos que toque.

John lo explica con el ejemplo del nodo simplificado a 7: su hijo izquierdo es 15 (que se muestra como 1015) y el derecho 16 (1016). Los nietos de 1015 serían 31 y 32. Los ancestros salen dividiendo entre potencias de dos. Todo eso lo resuelve la fórmula en una sola pasada, celda a celda, envolviendo la lógica en dos SI anidados que dejan vacías las posiciones donde no hay nodo.

La extensión con REDUCE: Leo

Leo sugiere ir un paso más allá con REDUCE para generar el árbol mediante iteración, permitiendo definir el rango de números y la profundidad de forma variable. Así el árbol deja de tener un tamaño fijo y se adapta a la red que quieras modelar. El fichero adjunto incluye la función GENERACUADRO, registrada como LAMBDA con nombre, que produce el cuadro completo a partir de un único número central.

Funciones clave

  • SECUENCIA y ENFILA: generan la rejilla de filas y columnas del cuadro.
  • RESIDUO y ENTERO: el motor de la aritmética binaria, para la posición dentro del nivel y la navegación entre niveles.
  • ABS y las potencias de dos: calculan la profundidad de cada celda y el salto entre generaciones.
  • REDUCE: convierte la estructura fija en un árbol de tamaño variable.
  • LAMBDA con nombre: empaqueta todo en una función reutilizable (GENERACUADRO).

Conclusión

Este caso es una pequeña clase magistral de cómo pensar un problema recursivo en clave matricial. En vez de recorrer el árbol nodo a nodo, John describe la posición de cada celda con matemáticas y deja que la matriz dinámica rellene todo de golpe. Es más difícil de leer que un simple APILARV, pero abre la puerta a resolver estructuras jerárquicas —organigramas, torneos, redes de referidos— con una sola celda. Y es justo el tipo de reto que la comunidad de Influexcel disfruta desmontando entre varios.

Más casos con estas funciones

Más contenido de Excel en InflueXcel