Abstract. An (n, d)-expander is a graph G = (V, E) such that for every X ⊆ V with |X| ≤ 2n − 2 we have |Γ G (X)| ≥ (d + 1)|X|. A tree T is small if it has at most n vertices and has maximum degree at most d. Friedman and Pippenger (1987) proved that any (n, d)-expander contains every small tree. However, their elegant proof does not seem to yield an efficient algorithm for obtaining the tree. In this paper, we give an alternative result that does admit a polynomial time algorithm for finding the immersion of any small tree in subgraphs G of (N, D, λ)-graphs Λ, as long as G contains a positive fraction of the edges of Λ and λ/D is small enough. In several applications of the Friedman-Pippenger theorem, including the ones in the original paper of those authors, the (n, d)-expander G is a subgraph of an (N, D, λ)-graph as above. Therefore, our result suffices to provide efficient algorithms for such previously non-constructive applications. As an example, we discuss a recent result of Alon, Krivelevich, and Sudakov concerning embedding nearly spanning bounded degree trees, the proof of which makes use of the Friedman-Pippenger theorem.We shall also show a construction inspired on Wigderson-Zuckerman expander graphs for which any sufficiently dense subgraph contains all trees of sizes and maximum degrees achieving essentially optimal parameters.Our algorithmic approach is based on a reduction of the tree embedding problem to a certain online matching problem for bipartite graphs, solved by Aggarwal et al. (1996).