我必须处理相当大的(> 10000条目)树结构。不是二元树,而是具有自然等级的数据(例如,根的子节点是大陆,大陆的子节点是国家,国家的子节点是城市)。
通过递归配对具有相同名称的条目并计算其子项的并集来完成合并。
Europe
Germany
Düsseldorf
Hamburg
(merged with)
Europe
Belgium
Mechelen
Germany
Stuttgart
(should give)
Europe
Belgium
Mechelen
Germany
Düsseldorf
Hamburg
Stuttgart
条目总是排序的,因此您永远不会遇到相同条目在不同树中以不同顺序出现的情况。
合并两棵树时,确保失败原子性的好方法是什么?具体来说,如果树在同一级别包含相同的叶条目,则整个合并操作应该失败。
Europe
Belgium
Gent
Mechelen
(merged with)
Europe
Belgium
Mechelen
(should fail, because Mechelen appears in both trees under Europe/Belgium)
答案 0 :(得分:1)
我认为David Eisenstat已经提供了一个可行的选择。
正如Durandal所提到的,您可以在开始合并操作之前检查重复的节点。
如果你已经有办法计算两棵树的交集,另一种可能的方法就是计算这个,如果它是空的则继续合并,否则抛出异常。您似乎期望交叉点为空或非常小,因此这不应占用太多空间。您还可以调整代码,以便在找到交叉元素时立即停止。
(我认为你因空间要求而排除的最自然的选择:创建一个新树,它是原始树的副本。在新树上进行合并操作,并在成功后继续使用新树这种方法类似于Java的String等不可变对象的操作。)