Я бы просто имел таблицу поддеревьев.
Прогуляйся по дереву в первую очередь. На каждом узле, после посещения подузлов, если в таблице есть эквивалентный узел, замените текущий узел на тот, который находится в таблице. Если в таблице нет эквивалентного узла, добавьте текущий узел в таблицу.
Это делает это? Я полагаю, что это называется общим-субвыражением-устранением.