What is the purpose of using different hash functions for the leaves and internals of a hash tree?
If the same standard hash function was used for both leaves and branch nodes, it would be easy to generate collisions and even second preimages.

For example, let $M$ be a message which is longer than the segment size of the hash tree, but (for simplicity) no more than two segments long. Then the hash value of $M$ is calculated as $$H(M) = H_I(H_L(M_0) \,\|\, H_L(M_1)),$$ where $H_I$ is the internal hash function, $H_L$ is the leaf hash function, and $M_0$ and $M_1$ are the first and second segments of $M$.  We'll also assume that the segment size of the hash tree is at least twice as long as the length of the output of $H_L$.

Now let $M&#39; = H_L(M_0) \,\|\, H_L(M_1)$.  Since $M&#39;$ is, by assumption, at most one segment long, its hash will be calculated as $$H(M&#39;) = H_L(M&#39;) = H_L(H_L(M_0) \,\|\, H_L(M_1)).$$  If $H_L = H_I$, then $H(M&#39;) = H(M)$, and we've just found a second preimage for $H(M)$.