// |(1)| |(2)| |(3)| // 11111 11111 ????? // (1) - size of offset // (2) - size of data // (3) - node // | (1) | | (2) | |(3)| | (4) | // ??????? ??????? 1 ????????? // (1) - offset of the left child // (2) - offset of the right child // (3) - is data present // (4) - data (only if (3) is equal to 1) // if (1) and (2) are equal to 0 then current node is a leaf public byte[] ToByteArray() { int MaxOffset = 0; T MaxData = default(T); List <BinaryTreeNodeSaver <T> > Result = new List <BinaryTreeNodeSaver <T> >(); var BinaryTreeNode = TreeFactory.GetTreeSaverNode <T>(this, ref MaxOffset, ref MaxData, Result); int MaxLen = ExtBitConverter.GetBitsCount(MaxOffset - 1) - 1; int DataLen = ExtBitConverter.GetBitsCount(Converter(MaxData)) - 1; ExtBitArray Buffer = new ExtBitArray(); Buffer.Push(MaxLen, 5); Buffer.Push(DataLen, 5); foreach (var v in Result) { if (!v.IsLeaf) { Buffer.Push(v.Left.Weight - v.Weight - 1, MaxLen); //Buffer.Push(v.Right.Weight - v.Weight - 1, MaxLen); if (!v.Data.Equals(EmptyData)) { Buffer.Push(1, 1); Buffer.Push(Converter(v.Data), DataLen); } else { Buffer.Push(0, 1); } } else { Buffer.Push(0, MaxLen); if (!v.Data.Equals(EmptyData)) { Buffer.Push(1, 1); Buffer.Push(Converter(v.Data), DataLen); } else { Buffer.Push(0, 1); } } } return(Buffer.ToByteArray()); }