Well, this way of extending GoLayoutTree:
public class LayoutTreeWithSpecialLayerAssignment : GoLayoutTree
{
protected override void AssignTreeNodeValues(GoLayoutTreeNode n) {
base.AssignTreeNodeValues(n);
GoBasicNode node = n.GoObject as GoBasicNode;
if (node != null) {
if (node.Text == "2") {
n.LayerSpacing = n.LayerSpacing * 2 + node.Height;
node.Brush = Brushes.Yellow;
}
}
}
}
will give you this (note the node with the label “2”)

and maybe that’s enough (n.Level will tell you the layer in the tree that node was computed to be at)
But… it seems to me there might be another (simpler?) way. Let the normal tree layout run. Then, recurse down through the tree, and for each node (in this case “4”, “5” and “6”) you would “detect” that they aren’t in the right category/layer by Y position, and you simple do a “move tree” of that node and all it’s children down to the right Y position. (TreeApp has some code for moving a whole subtree.)
I haven’t tried that, but it seems straightforward.