Я бы сделал что-то похожее на @Tom, если у вас много узлов. Решение @CarlG, вероятно, подходит для нескольких узлов. Если вы обновляете всю модель дерева, каждую секунду вы сталкиваетесь с проблемами производительности.
Я бы обновил только видимые границы дерева, если необходимо, и сохранил бы где-нибудь AST (синтаксическое дерево). Если модель дерева (из проанализированного документа) меняется каждую секунду, я серьезно сомневаюсь, что у пользователя будет время прокручивать все дерево каждую секунду.
User scrolled to bounds XXX
A = First visible node
B = Last visible node
if someRangeBefore(A) is dirty update
If region(A, B) is dirty
update nodes
Было бы сложнее, чем выше, реализовать работающую и очень эффективную стратегию обновления узлов.