private void AssertSegment(Segment segment) { Assert.IsTrue(segment.Range.From > 0); Assert.IsTrue(segment.Range.To > 0); Assert.IsTrue(segment.Range.From <= segment.Range.To); Assert.IsFalse(string.IsNullOrEmpty(segment.Name)); }
public void Insert(Segment segment) { if (_root == null) { _root = new SegmentTreeNode() { Range = segment.Range, Names = new List<string>() { segment.Name } }; } else { DoInsert(_root, segment); } }
private void DoInsert(SegmentTreeNode top, Segment segment) { var compareResult = segment.Range.CompareTo(top.Range); if (compareResult < 0) { AddLeftLeaf(top, segment); } else if (compareResult > 0) { AddRightLeaf(top, segment); } else { var intersection = RangeComparer.Intersect(top.Range, segment.Range); top.Range = intersection.Intersection; top.Names.Add(segment.Name); if (intersection.LeftSetDifference != null) { AddLeftLeaf(top, new Segment() { Range = intersection.LeftSetDifference, Name = segment.Name }); } if (intersection.RightSetDifference != null) { AddRightLeaf(top, new Segment() { Range = intersection.RightSetDifference, Name = segment.Name }); } } }
private void AddRightLeaf(SegmentTreeNode top, Segment segment) { if (top.Right == null) { top.Right = new SegmentTreeNode() { Range = segment.Range, Names = new List<string>() { segment.Name } }; } else { DoInsert(top.Right, segment); } }