+ right = 0; // Gets deleted in recursion.
+ //delete [] left;
+ //delete [] right;
+}
+
+// symbols is an array of elements of "width" bits.
+void static_sequence_wvtree_noptrs::build_level(uint **bm, uint *symbols, unsigned width, uint level, uint length, uint offset) {
+ if(level==height)
+ {
+ delete [] symbols;
+ return;
+ }
+ uint cleft=0;
+ for(uint i=0;i<length;i++)
+ if(!is_set(get_field(symbols, width, i),level))
+ cleft++;
+ uint cright=length-cleft;
+ uint *left=new uint[(cleft*width)/W + 1],
+ *right=new uint[(cright*width)/W + 1];
+ cleft=cright=0;
+ for(uint i=0;i<length;i++)
+ if(!is_set(get_field(symbols,width,i),level)) {
+ set_field(left,width,cleft++,get_field(symbols, width,i));
+ bitclean(bm[level],offset+i);
+ }
+ else {
+ set_field(right,width,cright++,get_field(symbols,width,i));
+ bitset(bm[level],offset+i);
+ }
+
+ delete [] symbols;
+ symbols = 0;
+
+ build_level(bm,left,width,level+1,cleft,offset);
+ left = 0; // Gets deleted in recursion.
+ build_level(bm,right,width,level+1,cright,offset+cleft);
+ right = 0; // Gets deleted in recursion.
+ //delete [] left;
+ //delete [] right;