But yes, tree optimisations... I could make the add/remove operations a tiny bit more complex, so that every node has "listensTo" as a property, the kind of messages it cares about. When I add a child to a node (a unit to a squad, in a unit < squad < tile < battlefield hierarchy for example), its "listensTo" property is merged with the parents'. So, an empty tile listens to almost nothing. If I move a squad into it, that tile listens to what the squad listens to.
Then, if I spawn a new unit in there, the unit, squad and tile all listen to a new type of message