我想让我的avl-tree
支持重复密钥,但binary search tree
的默认行为存在问题,重复项可能会使旋转可以使具有相同键的节点位于左侧和右侧父母的。
例如,当添加三个节点时,所有带有键A的节点将使树进行旋转,如下所示:
A
/ \
A A
因此,使用该密钥获取所有条目将是一个问题......并且双向搜索都不是很好。
我想到的解决方案是让每个节点都存储一个重复数组 所以当添加一个已经存在的新项目时,只需要向数组中添加一个新项目, 删除带有键的项将删除整个节点,而使用键查找所有项将返回该数组。
是否还有其他方法可以处理重复项?
insert项带有一个键和一个值..所以我需要存储这些值,以便通过findAll以某种键方法返回它们。
答案 0 :(得分:4)
另一种通用方法是在内部使值成为键的一部分,这样你就不再拥有重复的键了。无论如何,您都需要密钥和值,以便从允许重复的树中删除条目。
要在不知道值的情况下搜索密钥,您可以执行类似(伪代码)的操作:
searchResult = myTree.SearchGreaterOrEqual(Key);
found = (searchResult != null) && (searchResult.Key == Key);
答案 1 :(得分:3)
让每个节点都包含一个计数:添加重复数将增加计数,删除将减少计数,除非它是1,在这种情况下整个节点将被删除。