private int computeShift(GridRange[] ranges, GridRange[] otherRanges) {
		int shift = 0;
		int commonHeight = Math.min(ranges.length, otherRanges.length);
		for (int i = 0; i < commonHeight; i++) {
			GridRange range = ranges[i];
			GridRange otherRange = otherRanges[i];
			int myMax = range.max;
			int otherMin = otherRange.min;
			if (myMax >= otherMin - 1) {
				int diff = myMax - otherMin + 2; // we want 1 empty column between
				shift = Math.max(shift, diff);
			}
		}
		return shift;
	}
Creates a GridLocationMap for the subtree rooted at the given vertex. It does this by
recursively getting grid maps for each of its children and then merging them together
side by side.
@param g the original graph
@param tree the graph after edge removal to convert it into a tree
@param v the root of the subtree to get a grid map for
@return a GridLocationMap with the given vertex and all of its children position in the 
grid.
Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/graph/layout/flowchart/AbstractFlowChartLayout.java