代码之家  ›  专栏  ›  技术社区  ›  Ahmed Kotb

在avl树中处理重复密钥

  •  9
  • Ahmed Kotb  · 技术社区  · 14 年前

    我想让我的 avl-tree 支持重复键,但 binary search tree 对于副本,旋转可以使具有相等关键点的节点位于父节点的左侧和右侧。

    例如,当添加三个节点时,所有节点都使用键A将导致树进行如下旋转:

       A
      /  \ 
     A    A
    

    所以用那个键获取所有条目将是一个问题…而且在两个方向上搜索都不好。

    我想到的解决方案是让每个节点存储一个重复的数组 因此,当添加一个已经存在的新项时,将只是向数组中添加一个新项, 使用键删除项将删除整个节点,而使用键查找所有项将返回该数组。

    是否有其他方法处理重复项?

    insert项接受一个键和一个值。所以我需要存储这些值,以便findall用特定的key方法返回它们。

    2 回复  |  直到 10 年前
        1
  •  4
  •   500 - Internal Server Error    14 年前

    另一种通用的方法是在内部使键的值成为键的一部分,这样就不再有重复的键了。为了从允许重复的树中删除条目,无论如何都需要键和值。

    要在不知道值的情况下搜索密钥,可以执行以下操作(伪代码):

    searchResult = myTree.SearchGreaterOrEqual(Key);
    found = (searchResult != null) && (searchResult.Key == Key);
    
        2
  •  3
  •   jball    14 年前

    让每个节点包含一个计数:添加重复项将增加计数,删除将减少计数,除非它是1,在这种情况下,将删除整个节点。