Hi. What did you mean by rows? Are you refering to the vertices that line up together in a certain layout like the top layout?
If so, TreePlot doesn't seem to make this easy. As a first step, I would gather the locations of where TreePlot planned on putting the vertices by running the function once an appending their names and locations onto a list to use:
vlist = {};
TreePlot[{1 -> 4, 1 -> 6, 1 -> 8, 2 -> 6, 3 -> 8, 4 -> 5, 7 -> 8},
VertexRenderingFunction -> (AppendTo[vlist, {Last@#1, #2}]; &)];
Sow and Reap are often useful in these situations as well. "vlist" is now a list of pairs of "y" values and the corresponding vertex name.
Run Union on it to remove duplicate entries and to sort them:
Union@vlist
Gather the entries together by their first value:
GatherBy[Union@vlist, First]
Use Map and Part together to strip out the y values:
hierarchy = #[[All, 2]] & /@ GatherBy[Union@vlist, First]
This expression results in {{2, 3, 5, 7}, {4, 6, 8}, {1}}, which are the names of the vertices grouped together by their row from bottom to top. You can now use this in the construction of a VertexRenderingFunction for the original TreePlot.