【问题标题】:Handling duplicates keys within an AVL tree处理 AVL 树中的重复键
【发布时间】:2010-03-18 19:58:40
【问题描述】:

我想让我的avl-tree 支持重复键,但是binary search tree 的默认行为存在重复项,即旋转可能会使具有相同键的节点位于父节点的左侧和右侧。

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

   A
  /  \ 
 A    A

因此,使用该键获取所有条目将是一个问题......并且双向搜索并不好。

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

还有其他处理重复的方法吗?

插入项需要一个键和一个值..所以我需要存储值以便通过 findAll 使用某些键方法返回它们。

【问题讨论】:

    标签: binary-tree binary-search-tree avl-tree reference-counting


    【解决方案1】:

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

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

    searchResult = myTree.SearchGreaterOrEqual(Key);
    found = (searchResult != null) && (searchResult.Key == Key);
    

    【讨论】:

    • 不错的方法 :) 实际上我们需要使 delete 方法删除所有具有该键的项目...
    【解决方案2】:

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

    【讨论】:

    • 我忘了说树需要一个键和一个值,所以我必须存储值以在 findall 方法中返回它们...
    • 澄清一下,单个键会存储不同的值(不是重复值)吗?如果是这样,您的价值观数组解决方案对我来说似乎很好。
    猜你喜欢
    • 2016-04-02
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多