Yes that's true, but they don't have equal cost to transmit over the wire. Why should I transmit the larger, more expensive tree when the character frequencies are a smaller representation of the same information?
I was explaining my tradeoff within the context of the GWT RPC object serialization. My tree is a graph with nodes of type BinaryTree<E>, where E in my case is a HuffmanNode object containing a char and an int. My alphabet has 66 characters plus an EOM character. The number of total nodes in the tree is 133. Although the extra internal nodes have HuffmanNode instances that do not contain a char, they do still contain the int sum of the frequencies of all the characters under that subtree. The BinaryTree class itself has left, right, and parent references. So the way the GWT serialization format works out for this beast ends up being larger than the characters and frequencies alone.
I know what you're thinking: why not transform the tree into an Ahnentafel list and marshall it to a string containing only the alphabet characters in the appropriate slots, and use another chosen character to represent null slots, and write another implementation of the decoder that's driven off of the array? (Edit: Or, better still, transform it to a canonical Huffman codebook)
Yes, of course I could do that — and I actually want to. Alas, I have bigger fish to fry than writing the tree transformation code, the marshaling code, and the additional decoder implementation. So, when it's all said & done, according to the tradeoffs I was willing to make, my clients get to build the tree in O(n). I can tell that you're vexed that it worked out that way, but that's life.