public void AddRange(int start, int end, bool overlappingFound) { if (Value == null) { Value = new Range(start, end); return; } var range = new Range(start, end); //if (Value.ContainsRange(range)) return; if (LeftRange != null && range.IsOnLeft(Value)) { LeftRange.AddRange(start, end, overlappingFound || Value.IsOverlapping(range)); if (MergeWith(LeftRange.Value)) { if (LeftRange.LeftRange == null && LeftRange.RightRange == null) { LeftRange = null; } else if (LeftRange.RightRange == null) { LeftRange = LeftRange.LeftRange; } else if (LeftRange.LeftRange == null) { LeftRange = LeftRange.RightRange; } } } if (RightRange != null && range.IsOnRight(Value)) { RightRange.AddRange(start, end, overlappingFound || Value.IsOverlapping(range)); if (MergeWith(RightRange.Value)) { if (RightRange.LeftRange == null && RightRange.RightRange == null) { RightRange = null; } else if (RightRange.RightRange == null) { RightRange = RightRange.LeftRange; } else if (RightRange.LeftRange == null) { RightRange = RightRange.RightRange; } } } MergeWith(range); if (!overlappingFound) { if (Value.IsOnFullRight(range)) { if (RightRange == null) { RightRange = new RangeNode(); } RightRange.AddRange(range.Start, range.End, false); } else if (Value.IsOnFullLeft(range)) { if (LeftRange == null) { LeftRange = new RangeNode(); } LeftRange.AddRange(range.Start, range.End, false); } } }