We present algorithms for enumerating all spanning trees in directed, undirected and weighted graphs. The algorithms use a search tree technique to construct a computation tree. The computation tree is used to output all the spanning trees by listing the relative differences between spanning trees rather than the entire spanning trees themselves. For the undirected case, both the construction and the listing of the trees are shown to require O(N + V + E) time for a graph with V vertices, E edges and N spanning trees. This algorithm is optimal and is based on exchanging non-tree edges with tree edges in a fundamental cycle. A similar exchange technique is used to construct the computation tree for a directed graph in O(NV + V3) time. The time for listing out the trees remains O(N). For a weighted graph, we show how to sort the spanning trees by weight using the computation tree in O(N log V + V E) time.