public MinimumDepthQueryObject Combine(MinimumDepthQueryObject rightAdjacentObject) => new MinimumDepthQueryObject { SegmentStartIndex = SegmentStartIndex, SegmentEndIndex = rightAdjacentObject.SegmentEndIndex, MinimumDepthVertex = MinimumDepthVertex.Depth < rightAdjacentObject.MinimumDepthVertex.Depth ? MinimumDepthVertex : rightAdjacentObject.MinimumDepthVertex };
private void Build(int treeArrayIndex, int segmentStartIndex, int segmentEndIndex) { if (segmentStartIndex == segmentEndIndex) { _treeArray[treeArrayIndex] = new MinimumDepthQueryObject(segmentStartIndex, _sourceArray[segmentStartIndex]); return; } int leftChildTreeArrayIndex = 2 * treeArrayIndex + 1; int rightChildTreeArrayIndex = leftChildTreeArrayIndex + 1; int leftChildSegmentEndIndex = (segmentStartIndex + segmentEndIndex) / 2; Build(leftChildTreeArrayIndex, segmentStartIndex, leftChildSegmentEndIndex); Build(rightChildTreeArrayIndex, leftChildSegmentEndIndex + 1, segmentEndIndex); _treeArray[treeArrayIndex] = _treeArray[leftChildTreeArrayIndex].Combine(_treeArray[rightChildTreeArrayIndex]); }