@SuppressWarnings("unchecked")
  @Override
  public <E extends Entry<K, V>> E put(E entry) {
    if (entry.getKey() == null) {
      return updateNullEntry(entry);
    }

    if (entry.getValue() == null) {
      return remove(entry.getKey());
    }

    Object result = root.put(conf, entry);
    if (result == null) {
      this.size++;
      return null;
    }
    if (result instanceof Split) {
      Split<K, V> split = (Split<K, V>) result;
      this.root = new InnerNode<K, V>(conf, root, split.getKey(), split.getGreater());
      this.size++;
      return null;
    } else {
      return (E) result;
    }
  }