docs: private void adjustTree(IndexTreePath<E> subtree) {
      final Logging log = getLogger();
      if(log.isDebugging()) {
        log.debugFine("Adjust tree " + subtree + "\n");
      }
  
      // get the root of the subtree
      int nodeIndex = subtree.getIndex();
      N node = getNode(subtree.getEntry());
  
      // overflow in node; split the node
      if(hasOverflow(node)) {
        // do the split
        Assignments<E> assignments = settings.splitStrategy.split(this, node);
        final N newNode = node.isLeaf() ? createNewLeafNode() : createNewDirectoryNode();
  
        List<E> entries1 = new ArrayList<>(assignments.getFirstAssignments().size());
        List<E> entries2 = new ArrayList<>(assignments.getSecondAssignments().size());
        // Store final parent distances:
        for(DistanceEntry<E> ent : assignments.getFirstAssignments()) {
          final E e = ent.getEntry();
          e.setParentDistance(ent.getDistance());
          entries1.add(e);
        }
        for(DistanceEntry<E> ent : assignments.getSecondAssignments()) {
          final E e = ent.getEntry();
          e.setParentDistance(ent.getDistance());
          entries2.add(e);
        }
        node.splitTo(newNode, entries1, entries2);
  
        // write changes to file
        writeNode(node);
        writeNode(newNode);
  
        if(log.isDebuggingFine()) {
          log.debugFine(new StringBuilder(1000)//
              .append("Split Node ").append(node.getPageID()).append(" (").append(this.getClass()).append(')').append(FormatUtil.NEWLINE)//
              .append("      newNode ").append(newNode.getPageID()).append(FormatUtil.NEWLINE)//
              .append("      firstPromoted ").append(assignments.getFirstRoutingObject()).append(FormatUtil.NEWLINE)//
              .append("      firstAssignments(").append(node.getPageID()).append(") ").append(assignments.getFirstAssignments()).append(FormatUtil.NEWLINE)//
              .append("      firstCR ").append(assignments.computeFirstCover(node.isLeaf())).append(FormatUtil.NEWLINE)//
              .append("      secondPromoted ").append(assignments.getSecondRoutingObject()).append(FormatUtil.NEWLINE)//
              .append("      secondAssignments(").append(newNode.getPageID()).append(") ").append(assignments.getSecondAssignments()).append(FormatUtil.NEWLINE)//
              .append("      secondCR ").append(assignments.computeSecondCover(node.isLeaf())).append(FormatUtil.NEWLINE));
        }
  
        // if root was split: create a new root that points the two split nodes
        if(isRoot(node)) {
          // FIXME: stimmen die parentDistance der Kinder in node & splitNode?
          IndexTreePath<E> newRootPath = createNewRoot(node, newNode, assignments.getFirstRoutingObject(), assignments.getSecondRoutingObject());
          adjustTree(newRootPath);
        }
        // node is not root
        else {
          // get the parent and add the new split node
          E parentEntry = subtree.getParentPath().getEntry();
          N parent = getNode(parentEntry);
          if(log.isDebugging()) {
            log.debugFine("parent " + parent);
          }
          double parentDistance2 = distance(parentEntry.getRoutingObjectID(), assignments.getSecondRoutingObject());
          // logger.warning("parent: "+parent.toString()+" split: " +
          // splitNode.toString()+ " dist:"+parentDistance2);
          parent.addDirectoryEntry(createNewDirectoryEntry(newNode, assignments.getSecondRoutingObject(), parentDistance2));
  
          // adjust the entry representing the (old) node, that has been split
          double parentDistance1 = distance(parentEntry.getRoutingObjectID(), assignments.getFirstRoutingObject());
          // logger.warning("parent: "+parent.toString()+" node: " +
          // node.toString()+ " dist:"+parentDistance1);
          node.adjustEntry(parent.getEntry(nodeIndex), assignments.getFirstRoutingObject(), parentDistance1, this);
  
          // 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)) {
          E parentEntry = subtree.getParentPath().getEntry();
          N parent = getNode(parentEntry);
          E entry = parent.getEntry(subtree.getIndex());
          boolean changed = node.adjustEntry(entry, entry.getRoutingObjectID(), entry.getParentDistance(), this);
          // write changes in parent to file
          if(changed) {
            writeNode(parent);
            adjustTree(subtree.getParentPath());
          }
        }
        // root level is reached
        else {
          E rootEntry = getRootEntry();
          node.adjustEntry(rootEntry, rootEntry.getRoutingObjectID(), rootEntry.getParentDistance(), this);
        }
      }
    }