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); }
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); }
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; } }