Ejemplo n.º 1
0
        // |(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());
        }