【问题标题】:Remove duplicate elements from the BST从 BST 中删除重复元素
【发布时间】:2013-07-12 11:21:11
【问题描述】:

假设有一个包含重复元素的 BST。您必须从树中删除所有重复的元素。当找到相等的密钥时在 BST 中的插入是随机的,即在树中插入密钥时,如果所述密钥已经存在,则该密钥可以插入左子树或右子树,但仍然遵循 BST 的基本属性。所以任何节点的左子树上的所有键都小于或等于该节点,并且任何节点的右子树上的键都大于或等于该节点。您将如何删除所有重复的元素。

请注意,如果一个键(例如 15)在整个树中出现三次,我们不会删除所有三个实例,而是只删除两个,无论哪两个都没有关系。

存在以 PreOrder 方式遍历树的蛮力方法。然后查找并删除左右子树上的元素,它们的键等于所述节点。

有没有更好的方法来解决这个问题?

【问题讨论】:

    标签: c++ binary-search-tree


    【解决方案1】:

    您提到的蛮力方法的最坏情况复杂度为O(n^2)

    实现更好复杂性的一种方法是使用hash-table。您可以对 BST 进行遍历并将每个节点的计数存储在哈希表中。然后,再做一遍(以任何适合您的方式)并删除计数大于1 的节点。假设树是平衡的,这种方法的复杂度提高了O(n*logn)

    【讨论】:

    • 但这不会删除 BST 中所有出现的键吗?我需要在 BST 中保留一次出现的密钥并删除其余的。
    • 没有。仅当其计数大于 '1' 时才删除该键。
    猜你喜欢
    • 1970-01-01
    • 2013-05-19
    • 2013-05-20
    • 2015-01-05
    • 2013-12-10
    • 2011-07-03
    • 2012-05-09
    • 1970-01-01
    相关资源
    最近更新 更多