На первый беглый взгляд:
1) Можно открыть файл как нетипизированный с длиной записи 1, и вместо read использовать BlockRead, копируя в массив не по одному символу, а сразу весь файл. Получится чуть быстрее, правда, скорее всего, ненамного. Но и на доли секунды оптимизировать не помешает.
2)
Код
^char

Зачем??? У тебя и без этого массив динамический. Используя вместо char указатель на char, ты теряешь и время на выделение памяти под каждый символ, и время на переход по адресу в куче при каждом обращении к нему, и до 40 килобайт места в куче (каждый указатель весит 4 байта)
3) Чего -то с самим алгоритмом не того... Надо разобраться, он вообще правильно работает? Счас скачаю, попробую у себя посмотреть.
Мне самому эта задача интересна, скачал статью по той ссылке, чтобы дома на досуге разобраться, но чего-то не то с кодировкой оказалось
c-chopper, тебе к какому дню надо сдать? Попробую сочинить чего-нито.
З.Ы. Кстати, всё-таки сомнительно, чтобы от первокурсников требовалось применять деревья в задании. Наверное, уложиться в 1 секунду можно постараться как-нибудь по-другому...