public IntervalTreeNode <T> GetIntervalTree(IEnumerable <Interval <T> > intervals) { if (intervals == null) { return(null); } T[] pointsArray = GetPoints(intervals); T median = ArrayUtils.GetMedian <T>(pointsArray); IList <Interval <T> > left = new List <Interval <T> >(); IList <Interval <T> > right = new List <Interval <T> >(); IList <Interval <T> > current = new List <Interval <T> >(); foreach (Interval <T> interval in intervals) { if (interval.Contains(median)) { current.Add(interval); } else { if (median.CompareTo(interval.Start) < 0) { left.Add(interval); } else { right.Add(interval); } } } Interval <T>[] currentIntervals = current.ToArray <Interval <T> >(); Array.Sort(currentIntervals); IntervalTreeNode <T> currentNode = new IntervalTreeNode <T>(median, currentIntervals); currentNode.left = GetIntervalTree(left); currentNode.right = GetIntervalTree(right); return(currentNode); }
private static IntervalTreeNode Build(IList <Interval> intervals, int i, int j) { if (i > j) { return(null); } var mid = (i + j) / 2; var root = new IntervalTreeNode(intervals[mid]); root.Left = Build(intervals, i, mid - 1); root.Right = Build(intervals, mid + 1, j); var rangeBegin = root.Left?.Range.Begin ?? root.Value.Begin; var rangeEnd = root.Right?.Range.End ?? root.Value.End; root.Range = new Interval(rangeBegin, rangeEnd); return(root); }
private IEnumerable <Interval> GetOverlappingIntervals(IntervalTreeNode root, Interval interval) { if (root == null || !root.Range.Overlaps(interval)) { yield break; } if (root.Value.Overlaps(interval)) { yield return(root.Value); } foreach (var leftInterval in GetOverlappingIntervals(root.Left, interval)) { yield return(leftInterval); } foreach (var rightInterval in GetOverlappingIntervals(root.Right, interval)) { yield return(rightInterval); } }