**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;
    }