/// <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 <AsIntervalTree <T> >();

            currentTrees.Add(tree);

            //get all overlaps
            //and insert next dimension value to each overlapping node
            for (int i = 0; i < dimensions; i++)
            {
                var allOverlaps = new List <AsIntervalTree <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++;
        }
        /// <summary>
        /// does this interval overlap with any interval in this interval tree?
        /// </summary>
        /// <param name="start"></param>
        /// <param name="end"></param>
        /// <returns></returns>
        private List <DInterval <T> > GetOverlaps(AsIntervalTree <T> currentTree,
                                                  T[] start, T[] end, int dimension)
        {
            var nodes = currentTree.GetOverlaps(new AsInterval <T>(start[dimension], end[dimension]));

            if (dimension + 1 == dimensions)
            {
                var result = new List <DInterval <T> >();

                foreach (var node in nodes)
                {
                    var fStart = new T[dimensions];
                    var fEnd   = new T[dimensions];

                    fStart[dimension] = node.Start;
                    fEnd[dimension]   = node.End[node.MatchingEndIndex];

                    var thisDimResult = new DInterval <T>(fStart, fEnd);

                    result.Add(thisDimResult);
                }

                return(result);
            }
            else
            {
                var result = new List <DInterval <T> >();

                foreach (var node in nodes)
                {
                    var nextDimResult = GetOverlaps(node.NextDimensionIntervals, start, end, dimension + 1);

                    foreach (var nextResult in nextDimResult)
                    {
                        nextResult.Start[dimension] = node.Start;
                        nextResult.End[dimension]   = node.End[node.MatchingEndIndex];

                        result.Add(nextResult);
                    }
                }

                return(result);
            }
        }