docs: @Override
    protected void adjustTree(IndexTreePath<SpatialEntry> subtree) {
      if(getLogger().isDebugging()) {
        getLogger().debugFine("Adjust tree " + subtree);
      }
  
      // get the root of the subtree
      N node = getNode(subtree.getEntry());
  
      // overflow in node
      if(hasOverflow(node)) {
        if(node.isSuperNode()) {
          int new_capacity = node.growSuperNode();
          getLogger().finest("Extending supernode to new capacity " + new_capacity);
          if(isRoot(node)) { // is root
            node.adjustEntry(getRootEntry());
          }
          else {
            N parent = getNode(subtree.getParentPath().getEntry());
            SpatialEntry e = parent.getEntry(subtree.getIndex());
            HyperBoundingBox mbr = new HyperBoundingBox(e);
            node.adjustEntry(e);
  
            if(!SpatialUtil.equals(mbr, e)) { // MBR has changed
              // write changes in parent to file
              writeNode(parent);
              adjustTree(subtree.getParentPath());
            }
          }
        }
        else {
          int[] splitAxis = { -1 };
          // treatment of overflow: reinsertion or split
          N split = overflowTreatment(node, subtree, splitAxis);
  
          // node was split
          if(split != null) {
            // if the root was split: create a new root containing the two
            // split nodes
            if(isRoot(node)) {
              IndexTreePath<SpatialEntry> newRootPath = createNewRoot(node, split, splitAxis[0]);
              height++;
              adjustTree(newRootPath);
            }
            // node is not root
            else {
              // get the parent and add the new split node
              N parent = getNode(subtree.getParentPath().getEntry());
              if(getLogger().isDebugging()) {
                getLogger().debugFine("parent " + parent);
              }
              SpatialEntry newEntry = createNewDirectoryEntry(split);
              parent.addDirectoryEntry(newEntry);
  
              // The below variant does not work in the persistent version
              // E oldEntry = subtree.getEntry();
              // [reason: if oldEntry is modified, this must be permanent]
              SpatialEntry oldEntry = parent.getEntry(subtree.getIndex());
  
              // adjust split history
              SplitHistory sh = ((SplitHistorySpatialEntry) oldEntry).getSplitHistory();
              if(sh == null) {
                // not yet initialized (dimension not known of this tree)
                sh = new SplitHistory(oldEntry.getDimensionality());
                sh.setDim(splitAxis[0]);
                ((SplitHistorySpatialEntry) oldEntry).setSplitHistory(sh);
              }
              else {
                ((SplitHistorySpatialEntry) oldEntry).addSplitDimension(splitAxis[0]);
              }
              try {
                ((SplitHistorySpatialEntry) newEntry).setSplitHistory((SplitHistory) sh.clone());
              }
              catch(CloneNotSupportedException e) {
                throw new RuntimeException("Clone of a split history should not throw an Exception", e);
              }
  
              // adjust the entry representing the (old) node, that has
              // been split
              node.adjustEntry(oldEntry);
  
              // write changes in parent to file
              writeNode(parent);
              adjustTree(subtree.getParentPath());
            }
          }
        }
      }
      // no overflow, only adjust parameters of the entry representing the
      // node
      else {
        if(!isRoot(node)) {
          N parent = getNode(subtree.getParentPath().getEntry());
          SpatialEntry e = parent.getEntry(subtree.getIndex());
          HyperBoundingBox mbr = new HyperBoundingBox(e);
          node.adjustEntry(e);
  
          if(node.isLeaf() || // we already know that mbr is extended
              !SpatialUtil.equals(mbr, e)) { // MBR has changed
            // write changes in parent to file
            writeNode(parent);
            adjustTree(subtree.getParentPath());
          }
        }
        // root level is reached
        else {
          node.adjustEntry(getRootEntry());
        }
      }
    }