Java, 268
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=0,t;long p,x,I,s=a.length;int[]r=new int[(int)s];for(i=0;i<32;i++)if((s&1<<i)!=0)n=i+1;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;
}