Я рекомендую покопаться в xmldifff http://www.logilab.org/859 и посмотреть, как они сравнивают узлы и обрабатывают параллельные деревья. Или попробуйте написать [рекурсивный] генератор, который выдает каждый [значимый] узел в дереве, скажем, f(t)
, а затем используйте itertools.izip(f(t1),f(t2))
, чтобы собрать вместе пары узлов для сравнения.
Большинство иерархических структур, с которыми я имею дело, имеют более одной "оси", например элементы и атрибуты в XML, и некоторые узлы более значимы, чем другие.
Для более причудливого решения сериализуйте два дерева в текстовые файлы, сделайте справочное замечание, что строка #n идет от узла #x в дереве. Сделайте это с обоими деревьями, загрузите файлы в diff и просканируйте результаты, чтобы заметить, какие части дерева изменились. Вы можете отобразить эту строку #n из файла 1 (и, следовательно, узел #x в первом дереве) и строку #m из файла 2 (и, следовательно, узел #y второго дерева), означая, что некоторая часть каждого дерева одинакова или отличается.
Для любого решения вам придется установить «каноническую форму» вашего дерева, которая может отбросить все игнорируемые пробелы, отображать атрибуты, дополнительные узлы и т. Д. Из процесса сравнения. Это также может означать прохождение дерева в ширину и сначала в глубину.