Constructing a hash tree is simple enough if the data fits into a number of blocks that is a power of two.
root = H(H(A+B)+H(C+D))
/ \
H(A+B) H(C+D)
/ \ / \
A B C D
In other cases, there is some flexibility. The missing blocks could be replaced with zeroes...
root = H(H(A+B)+H(C+0))
/ \
H(A+B) H(C+0)
/ \ / \
A B C 0
...passed up the tree...
root = H(H(A+B)+C)
/ |
H(A+B) |
/ \ |
A B C
...hashed up the tree...
root = H(H(A+B)+H(C))
/ |
H(A+B) H(C)
/ \ |
A B C
...or something different...
root = H(H(A)+H(B+C))
/ |
H(A) H(B+C)
/ / \
A B C
...and I'm just assuming that they do anything else like padding incomplete blocks before hashing.
The term "Tiger Tree Hash" seems to be used to refer to the root of a specific type of Tiger-based hash tree, but I haven't been able to find the details documented anywhere. How are such hashes constructed?