コード例 #1
0
        public static BinaryTreeNode <T> FromByteArray(byte[] Data)
        {
            BinaryTreeNodeSaver <T> res  = new BinaryTreeNodeSaver <T>();
            ExtBitArray             Bits = new ExtBitArray(Data);

            Bits.Seek(0);
            int OffsetLen = Bits.Read(5);
            int DataLen   = Bits.Read(5);

            res.Weight = 0;
            List <int> Offsets = new List <int>();

            Offsets.Add(Bits.Read(OffsetLen));
            Offsets.Add(Bits.Read(OffsetLen));
            res.Weight = 0;
            int Weight = 0;

            for (int i = 0; i < Offsets.Count; i++)
            {
                if (Offsets[i] == 0)
                {
                    continue;
                }
                Weight += Offsets[i];
                Bits.Seek((10 + Weight) * 8);
                Offsets.Add(Bits.Read(OffsetLen));
            }
            return(res);
        }
コード例 #2
0
ファイル: TreeFactory.cs プロジェクト: Stonefacer/Ext
        public static BinaryTreeNodeSaver <T> GetTreeSaverNode <T>(IBinaryTreeNode <T> Root, ref int MaxOffset, ref T MaxData, List <BinaryTreeNodeSaver <T> > Result = null)
        {
            var Res = new BinaryTreeNodeSaver <T>(Root);

            Result?.Add(Res);
            List <BinaryTreeNodeSaver <T> > Saver = new List <BinaryTreeNodeSaver <T> >();

            Saver.Add(Res);
            List <BinaryTreeNodeSaver <T> > Buf = new List <BinaryTreeNodeSaver <T> >();

            //Res.Update(Buf, ref MaxOffset, ref MaxData);
            do
            {
                foreach (var v in Saver)
                {
                    v.Update(Buf, ref MaxOffset, ref MaxData);
                }
                Result.AddRange(Buf);
                var SwapBuf = Saver;
                Saver = Buf;
                Buf   = SwapBuf;
                Buf.Clear();
            } while(Saver.Count != 0);
            var id = Result.IndexOf(Result.Last(x => !x.IsLeaf)) + 1;

            Result.RemoveRange(id, Result.Count - id);
            return(Res);
        }
コード例 #3
0
 public void Update(List <BinaryTreeNodeSaver <T> > Result, ref int MaxOffset, ref T MaxData)
 {
     if (!base.IsLeaf)
     {
         Left  = new BinaryTreeNodeSaver <T>(base.Left);
         Right = new BinaryTreeNodeSaver <T>(base.Right);
         Result.Add(Left);
         Result.Add(Right);
         var Offset = Right.Weight - Weight;
         if (Offset > MaxOffset)
         {
             MaxOffset = Offset;
         }
     }
     if (!Data.Equals(EmptyData) && Converter(Data) > Converter(MaxData))
     {
         MaxData = Data;
     }
 }