protected T fetchOverlappingInterval(T queryInterval) {
    Node<U, T> node = (Node<U, T>) binarySearchTree.getRoot();
    while (node != null) {
      if (node.getValue().overlaps(queryInterval)) {
        return node.getValue();
      }
      Node<U, T> leftChild = node.getLeft();
      node = node.getRight();
      if (leftChild != null) {
        int cmp = leftChild.getSubtreeSpanHigh().compareTo(queryInterval
                                                               .getLow());
        if (cmp > 0 || cmp == 0 && leftChild.isClosedOnSubtreeSpanHigh()
            && queryInterval.isClosedOnLow()) {
          node = leftChild;
        }
      }
    }
    return null;
  }