Search code examples
algorithmtreedrawing

Algorithm for efficiently drawing trees?


I need to draw a corporate structure tree (sort-of like a family tree) in C#. All the ancillary code is there. It is colored, interactive, and fancy. The only trouble is the algorithm that actually decides where to put each node is giving me a lot of grief.

For the moment, boxes are 100x50 in size, and I have a class called StaffNode which represents a staff member at a particular x,y co-ordinate.

The algorithm just needs to create a List<StaffNode> with the appropriate x's and y's.

This is incredibly tricky.

Basically the algorithm is recursive along the corporate structure, so left->right, then top->down along the tree. Obviously it is bad if two nodes are on top of one another.

I can think of a few algorithms that might produce something like this:

          *
    o         O
o o o o o     O
o         O O O O O
                O

Whereas something like this would be better, since the tree is very large and space is very limited:

       *
    o     O
o o o o o O
o     O O O O O
            O

Have any of you had to draw a tree like this before? If you have I'm sure you've come across the many hurdles I've got. Any tips? So far I've spent an entire day on it.


Solution

  • There are many good algorithms for drawing trees, each of which shows off some different property of trees. If you want to show off a hierarchy, there is this code for WPF that draws hierarchies. For a more general discussion of how to draw graphs and trees, considering looking at these lecture slides on the Reingold-Tilden algorithm, which is relatively straightforward to implement and runs quickly in theory and practice. There's also these excellent slides covering similar material.

    Hope this helps!