Ah, I was mistaken then. There already is a two-way relationship between Animal and Zoo. Other than a few extra characters, there's no difference between animal.zoo.getSomeMethodInZooClass() that you want to do, and animal.getWhichZoo().getSomeMethodInZooClass(), which you can do. Well, there is an extra method call, but that's not a big deal.
This kind of circular reference really isn't a problem. At least it doesn't suffer from the "ad nauseum" effect as you seem to be defining it.
I do have a couple of suggestions though. A TreeMap is used for sorted collections, and here it's only sorted by the order Animals are added to the Zoo. You're paying a price in performance for no real reason. I'd switch that out for an ArrayList, or possibly a HashMap keyed on the animals description and/or id. Also when you add an animal to a zoo,
you should check to see if it's already in a zoo, and either reject the add or remove it from the other zoo's collection. You may want to synchronize the collection or the methods that modify it in order to make the classes
thread safe.