Bueno pues aquí va algo que he pensado, eso si, muy enrevesado... xddd
Es a nivel de programación, ya que algo a nivel matemático no he sido capaz de sacar.
• Tenemos el número total de filas: numFilas
• Dividimos dicho número de filas entre 2 para sacar el número de nodos de la columna 0:
nodosCol0 = numFilas/2
• Calculamos el logaritmo en base 2 de nodosCol0 para sacar el número de columnas:
numCol = log(nodosCol0)/log(2)
• Creamos una matríz [numCol X nodosCol0] que albergue por cada columna, los números de nodo que le pertenecen:
Recorremos el arbol de la manera que hay que recorrerlo, desde el nodo 0--> http://oi47.tinypic.com/2dwcnes.jpg
Puesto que para cada nodo conocemos su columna almacenamos cada uno en su registro de la matríz correspondiente, quedando la matríz de esta manera una vez recorrido todo el arbol:
[b]Col0-->0, 4, 5, 7, 8, 11, 12, 14
Col1-->1, 6, 9, 13
Col2-->2, 10
Col3-->3[/b]
• Recorremos la matríz para sacar las filas de los nodos que contiene (suponiendo que la matríz comienza en 0):
Obtenemos un multiplicador (multi) que, multiplicado por la posición de los nodos en la matríz, nos devolverá la fila que ocupa dicho nodo. De esta manera iremos almacenando las filas de cada nodo en un array, el cual contendrá todos los nodos ordenados por filas y no según el orden indicado inicialmente.
[code]for(p=0; p<=numCol; p++){
multi = 2^(p+1);
for(j=0; j<nodosCol0; j++){
fila = j * multi + sumatorio(p);
array[fila] = matriz[p][j];
}
}[/code]
• El array que obtendremos para el caso del árbol grande que he puesto en la foto sería el siguiente, es decir el orden "por filas" de los nodos:
[0, 1, 4, 2, 5, 6, 7, 3, 8, 9, 11, 10, 12, 13, 14]
¿Como lo veis? a ver si alguien podría aportar algo más matemático, en caso de que fuera posible