Рекомендую посмотреть сюда:
stackoverflow.com/questions/523307/semantic-diff-utilities. В особенности на комментарий Ira Baxter.
В качестве собственного варианта могу предложить вам, например, сделать представление дерева в виде списка(просто последовательный обход всех вершин), а потом применить к этому списку обычный diff.