In Angular 1.x.x you simply ask for the same service and you end up with the same instance, making it possible to share the data in the service.
Now in Angular 2 I h
It depends, if there is a simple case
a) A -> B -> C A has two child B and C and if you want to share data between A and B or A and C then use (input / output)
If you want to share between B and C then also you can use (input / output) but it is suggested to use Service.
b) If the tree is big and complex. (if there are so many levels of parent and children connections.) And in this case if you want to share data then I would suggest ngrx
It implements the flux architecture which creates a client side store to which any component can subscribe and can update without creating any race condition.