protected void doReInsert(NR n, LevelInfo levelInfo) {
		// RI1, RI2
		// Create a "max heap"
		PriorityQueue<LeastDistanceFromCenterToPoint> farthest = new PriorityQueue<>();
		Iterator<? extends DBTreeRecord<?, ? extends NS>> it = getChildrenOf(n).iterator();
		for (int i = 0; i < reinsertCount; i++) {
			assert it.hasNext();
			DBTreeRecord<?, ? extends NS> next = it.next();
			farthest.add(new LeastDistanceFromCenterToPoint(next, n.getShape()));
		}
		/**
		 * Now that the heap is sized "reinsertCount", after each new entry, I can remove the
		 * nearest, knowing it can't possibly be selected for reinsertion. In the meantime, since I
		 * know each removed entry will remain in its parent, I can compute the new bounds of the
		 * parent.
		 */
		NS boundsNearest = null;
		int dataCountNearest = 0;
		while (it.hasNext()) {
			DBTreeRecord<?, ? extends NS> next = it.next();
			farthest.add(new LeastDistanceFromCenterToPoint(next, n.getShape()));
			LeastDistanceFromCenterToPoint near = farthest.poll();
			boundsNearest = boundsNearest == null ? near.record.getBounds()
					: boundsNearest.unionBounds(near.record.getBounds());
			dataCountNearest += near.record.getDataCount();
		}
		assert farthest.size() == reinsertCount;

		// RI3
		// NOTE: entries are removed as part of Insert step (by virtue of updated parent)
		n.setChildCount(maxChildren + 1 - reinsertCount);
		n.setShape(boundsNearest);
		int dataCountReduction = n.getDataCount() - dataCountNearest;
		n.setDataCount(dataCountNearest);
		NR p = getParentOf(n);
		while (p != null) {
			int newDataCount = p.getDataCount() - dataCountReduction;
			p.setDataCount(newDataCount);

			// I can't think of a better way to re-compute the bounds in the path
			p.setShape(unionStream(getChildrenOf(p).stream().map(DBTreeRecord::getBounds)));
			p = getParentOf(p);
		}

		// RI4 (close reinsert)
		// NOTE: I know all children will be processed before we could possibly cause a split of n
		while (!farthest.isEmpty()) {
			LeastDistanceFromCenterToPoint far = farthest.poll();
			doInsert(far.record, levelInfo);
		}
	}
The Split algorithm as defined in Section 4.2 of the paper.

@param n the node to split
@return the new node (containing the second group)
Ghidra/Debug/ProposedUtils/src/main/java/ghidra/util/database/spatial/AbstractRStarConstraintsTree.java