private void assignColumns(FGVertex source, Map<FGVertex, Node> nodesByVertices,
				GridLocationMap<FGVertex, FGEdge> gridLocations) {

			Node node = nodesByVertices.get(source);
			int parentColumn = node.col;
			if (node.left == null) {
				return; // we assign left first, so it is null, then there is no right
			}

			Node left = node.left;
			Node right = node.right;
			if (alreadyAssigned(node)) {
				return;
			}

			if (left.col == 0) { // not set
				// align the left node directly under the parent
				left.col = parentColumn;
				gridLocations.col(left.v, left.col);
			}

			if (right != null) {
				if (right.col == 0) {
					right.col = parentColumn + 1;
					gridLocations.col(right.v, right.col);
				}

				// descend right then left so that the graph goes to the right and then downward
				assignColumns(node.right.v, nodesByVertices, gridLocations);
			}

			assignColumns(node.left.v, nodesByVertices, gridLocations);
		}
A simple layout that is used during testing
Ghidra/Features/FunctionGraph/src/test.slow/java/ghidra/app/plugin/core/functiongraph/graph/layout/TestFGLayoutProvider.java