There are no rules, but in some cases it can be a good idea to have a list of a type of object (or several types of similar objects), then keep them synced to a grid / space partitioning scheme as they move about, i.e. if an object moves off one grid square and onto another, you remove a reference to it from a list on gridsquare A and add it to gridsquare B.
In some cases (particularly non-moving objects like trees) you might be able to keep all the info for the object on the gridsquare, instead of maintaining a separate list. Might depend on other things too like your strategy for rendering them, how simple you want your code to be etc, how much data stored on the object, cache misses etc.
Once you have things in a coarse grid, questions of collision detection / find the nearest whatever can usually be done by just going through the lists on your gridsquare. There are a few gotchas, like what happens when you are looking for something and you are on the edge of a grid square, but these aren't super tricky to figure out.
(Bizarrely in your particular situation, you may in fact be able to precalculate the nearest tree to each tile, then re-calculate those that are changed when you cut down a tree. However don't let that distract you from coming up with a good general spatial partitioning scheme as you will no doubt need it! )