Предполагая, что вы сжимаете 8-битные символы (то есть байты), а алгоритм неадаптивный, самый простой способ - хранить не дерево, а распределение значений. Например, сохраняя, как часто вы находите байт 0, как часто байт 1, ..., как часто байт 255. Затем при чтении файла вы можете заново собрать дерево. Это простейшее решение, но оно требует наибольшего пространства для хранения (например, для покрытия больших файлов, вам потребуется 4 байта на значение, то есть 1 КБ).
Вы могли бы оптимизировать это, не сохраняя точно, как часто каждый байт был найден в файле, а вместо этого нормализуя значения до 0..255 (0 = найдено меньше, ...), в этом случае вы бы нужно всего лишь сохранить 256 байтов. Повторная сборка дерева на основе этих значений приведет к тому же дереву. (Это не будет работать, как указано Эдмундом и в вопросе 759707 - см. Дополнительные ссылки и ответы на ваш вопрос)
P.S .: И, как сказал Хенк, использование seek () позволяет вам оставить место в начале файла, чтобы сохранить значения в более позднем.