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
SECUENCIAgenera las filas, yENFILAsu 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
RESIDUOdecide 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
ENTEROdividiendo 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
SECUENCIAyENFILA: generan la rejilla de filas y columnas del cuadro.RESIDUOyENTERO: el motor de la aritmética binaria, para la posición dentro del nivel y la navegación entre niveles.ABSy 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.LAMBDAcon 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
- Generar la serie de Fibonacci con REDUCE, APILARV y LAMBDA CasoInteresante ejercicio compartido en la comunidad: generar los primeros N números de la serie de Fibonacci usando exclusivamente fórmulas de
- Optimización de REDUCE+APILARV con LAMBDA recursiva en bisección CasoAlejandro plantea un reto de rendimiento interesante: tiene una fórmula LET enorme que calcula la permanencia de carga en puerto por matrícu
- Descomposición de Cholesky con matrices dinámicas: de VBA a LAMBDA+REDUCE CasoJuan Pablo lanza un reto al grupo: tiene una descomposición de Cholesky resuelta con VBA y quiere saber si se puede hacer con matrices dinám
- Cálculos iterativos con REDUCE y APILARV en Excel CasoLa comunidad aborda un caso sobre cómo trabajar con bucles iterativos en Excel usando funciones modernas. Un miembro necesita realizar cálcu
- Serie de Fibonacci con LAMBDA y REDUCE en una sola fórmula CasoSurge un reto interesante en la comunidad: generar la serie de Fibonacci con una sola fórmula de Excel, sin celdas auxiliares ni macros. Un
- Distribución equitativa con LAMBDA, REDUCE y ALEATORIO CasoHector plantea la necesidad de repartir un conjunto de líneas (tareas, actividades) entre varios grupos de forma equitativa y aleatoria. Ide
- Funciones personalizadas en Excel: LET, LAMBDA y recursividad TutorialCómo pasar de una fórmula escrita a mano a una función propia que puedes llamar por su nombre en cualquier libro. Los tres vídeos de esta pá
- REDUCE de CERO a PRO TutorialCon REDUCE podrás transformar listas simples en análisis completos y automatizar cálculos que antes parecían imposibles. Si trabajas con dat
- Desglose de asientos contables con unpivot y generación automática de contrapartidas CasoInteresante problema planteado por Juan en el grupo: tiene una tabla de asientos contables en formato horizontal (cada fila contiene cuenta,
- Reto de agrupación y pivotado: AGRUPARPOR vs ARCHIVOMAKEARRAY vs MAP CasoLeandro trae un reto de internet al grupo: a partir de una tabla con claves repetidas y valores, generar una tabla pivotada donde cada clave