private static object[] ToTreeObjectWithBalance(ToTreeObjectParams @params, ref int h) { if (@params.Len == 0) { return(Empty); } h++; if (@params.Len == 1) { return new object[] { 1, new[] { // запись @params.Elements[@params.Beg], // значение Empty, Empty, 0 } } } ; int leftH = 0, rightH = 0, l = @params.Len; @params.Len /= 2; var left = ToTreeObjectWithBalance(@params, ref leftH); @params.Beg += @params.Len + 1; @params.Len = l - @params.Len - 1; return(new object[] { 1, new[] { // запись @params.Elements[@params.Beg + @params.Len / 2], // значение left, ToTreeObjectWithBalance(@params, ref rightH), leftH - rightH } }); }
private object[] ToTreeObject(ToTreeObjectParams @params) { if (@params.Len == 0) { return new object[] { Int32.MinValue, new object[] { 0, null } } } ; //if (len == 1) // return new[] // { // // запись // elements[beg], // значение // new object[]{0, null} // }; int len = @params.Len; @params.Len = (int)(@params.Len * 0.5); int value = @params.Elements[@params.Len == 0 ? @params.Beg : @params.Beg + @params.Len]; object[] left = ToTreeObject(new ToTreeObjectParams(@params.Elements, @params.Beg, @params.Len)); @params.Beg += @params.Len + 1; @params.Len = len - @params.Len - 1; return(new object[] { // запись value, // значение new object[] { 1, new object[] { left, ToTreeObject(@params), 0 } } }); }