I have some questions after reading your code.
- Before you get maxright and maxbottom, you are getting all nodes in a single LIST<>. Right? That means all children, grandchildren etc are in the same flat List<>.
- What is the purpose of adding a 2 before returning a value from GetMaxRigth or GetMaxBottom methods?
What I had done in my approach, was use your initial approach, but modified it so the number of iterations is minimized. I executed your initial code with a step value of 100, so I would be within 100 pixels more than the optimal width. I then executed your code again but with a step of 5., so I am within 5 pixels more than optimum width. This way I would end up with very few iterations. May be 4 or 5 iterations as opposed to 200 or 400 iterations that I would end up with if using a step of 1.