You might want to use the Strategy(GoF) pattern:
http://en.wikipedia.org/wiki/Strategy_pattern
- Create an interface LivingAnimal with a method addToTree(Tree tree)
- Implement this interface in objects Cat, Dog, etc.
- in Cat.addToTree(Tree tree) (and other objects), do your cat specific stuff, and add itself in the tree (tree.add(this))
- In your controller, create a method addChildren(LivingAnimal p). This method finds the correct type of object (Cat, Dog, etc.) and calls addToTree(tree) on it.
When you're using Strategy(GoF), you're delegating the responsibility to the right object. In this case, you'll simplify your controller and keep a high cohesion on the various objects.