JSFiddle - React, Tailwind, and code Playground
JavaScript
function buildLayers(left, right, n, depth, layers){
if(n == left || n == right ){return null}
let t = {}
t.n = n;
if(!layers[depth]){
layers[depth]=[];
}
layers[depth].push(t.n);
t.left = buildLayers(left, n, Math.floor((left + n)/2), depth+1, layers)
t.right = buildLayers(n, right, Math.floor((right + n)/2), depth+1, layers)
return t;
}
function specialBuild(N){
let layers = [];
let t2 = buildLayers(1, N, Math.floor((1+N)/2),0, layers);
//your special case
layers.unshift([1,N]);
return layers;
}
function getBack(i, layers){
let depth = 0;
let layer = layers[depth];
while(i >= layers[depth].length){
i -= layers[depth].length;
depth++;
}
return layers[depth][i];
}
function log(...v){
document.querySelector('div').innerHTML += v.join(' ')+'<br/>';
}
function main(N){
log('processing', N)
let layers = specialBuild(N);
for(let i = 0; i<N; ++i){
log(i,'-->', getBack(i, layers))
}
}
main(12);
main(16);