/// <summary>
        /// Add a new interval to this interval tree
        /// </summary>
        /// <param name="start"></param>
        /// <param name="end"></param>
        public void Insert(T[] start, T[] end)
        {
            validateDimensions(start, end);

            var currentTrees = new List <IntervalTree <T> > {
                tree
            };


            //get all overlaps
            //and insert next dimension value to each overlapping node
            for (var i = 0; i < dimensions; i++)
            {
                var allOverlaps = new List <IntervalTree <T> >();

                foreach (var tree in currentTrees)
                {
                    tree.Insert(new AsInterval <T>(start[i], end[i]));

                    var overlaps = tree.GetOverlaps(new AsInterval <T>(start[i], end[i]));
                    foreach (var overlap in overlaps)
                    {
                        allOverlaps.Add(overlap.NextDimensionIntervals);
                    }
                }

                currentTrees = allOverlaps;
            }

            Count++;
        }