Самым многообещающим, что я видел до сих пор (который, по общему признанию, не очень длинный ...), является структура данных Zipper : она в основном сохраняет отдельную структуру, обратный путь от узла к корню, и делает локальные правки на этой отдельной структуре.
Он может выполнять несколько локальных изменений, большинство из которых имеют постоянное время, и записывать их обратно в дерево (восстанавливая путь к корню, которые являются единственными узлами, которые необходимо изменить), и все за один раз.
Zipper - это стандартная библиотека в Clojure (см. Заголовок Zippers - Функциональное редактирование дерева ).
И есть оригинальная статья Huet с реализацией в OCaml.
Отказ от ответственности: я программировал в течение долгого времени, но начал функциональное программирование только пару недель назад, и никогда не слышал о проблеме функционального редактирования деревьев до прошлой недели, поэтому вполне могут быть и другие решения Я не в курсе.
Тем не менее, похоже, что Молния делает большую часть того, что можно пожелать. Если есть другие варианты в O (log n) или ниже, я бы хотел их услышать.