**Java**, 252 Ok, here is my attempt. I've been playing around with bit operations and I came up with this direct way of calculating the index of an element in the BST from the index in the original array. Compressed version public int[]b(int[]a){int i,n=1,t;long x,I,s=a.length,p=s;int[]r=new int[(int)s];while((p>>=1)>0)n++;p=2*s-(1l<<n)+1;for(i=0;i<s;i++){x=(i<p)?(i+1):(p+2*(i-p)+1);t=1;while((x&1<<(t-1))==0)t++;I=(1<<(n-t));I|=((I-1)<<t&x)>>t;r[(int)I-1]=a[i];}return r;} The long version follows below. public static int[] makeBst(int[] array) { long size = array.length; int[] bst = new int[array.length]; int nbits = 0; for (int i=0; i<32; i++) if ((size & 1<<i)!=0) nbits=i+1; long padding = 2*size - (1l<<nbits) + 1; for (int i=0; i<size; i++) { long index2n = (i<padding)?(i+1):(padding + 2*(i-padding) + 1); int tail=1; while ((index2n & 1<<(tail-1))==0) tail++; long bstIndex = (1<<(nbits-tail)); bstIndex = bstIndex | ((bstIndex-1)<<tail & index2n)>>tail; bst[(int)(bstIndex-1)] = array[i]; } return bst; }