Efficient in what sense? Computationally and storage wise it is the most efficient.
and in the special case of extremely sparse graphs like trees, the adjacency matrix isn't going to win very often.
your copy of CLRS should discuss all of this. and for practical uses of non-adjacency matrix representations of trees, you can take a look at every functional programming language, ever.