code: private Node createNode(final Iterable<Range<C>> ranges) {
          Range<C> span = Iterables.getFirst(ranges, null);
          if (span == null) {
              return null;
          }
          for (Range<C> range : ranges) {
              checkNotNull(range, "ranges must not contain null ranges");
              span = range.span(span);
          }
          if (span.isEmpty()) {
              return null;
          }
          C center = Ranges.center(span);
          List<Range<C>> left = Lists.newArrayList();
          List<Range<C>> right = Lists.newArrayList();
          List<Range<C>> overlap = Lists.newArrayList();
          for (Range<C> range : ranges) {
              if (Ranges.isLessThan(range, center)) {
                  left.add(range);
              }
              else if (Ranges.isGreaterThan(range, center)) {
                  right.add(range);
              }
              else {
                  overlap.add(range);
              }
          }
          return new Node(center, createNode(left), createNode(right), overlap);
      }
docs: Create and return a new node for the specified ranges.
  
  @param ranges ranges
  @return a new node for the specified ranges