【问题标题】:C++: Counting the duplicates in a BSTC++:计算 BST 中的重复项
【发布时间】:2013-07-24 08:14:36
【问题描述】:

我有一个 BST 作为;

    8
   / \
  4  12
   \
    6
   /
   6

我有以下代码来计算重复计数,这里应该是 1(6 有重复);

struct Node
{
    int data;
    Node *left, *right;
};


void inorder(Node *root, Node *previous, int count)
{
    if(root != NULL)
    {
        if(root != previous && root->data == previous->data)
            count++;
        previous = root;
        inorder(root->left, previous, count);
        cout<<root->data<<" ";
        inorder(root->right, previous, count);
    }
}

我必须这样做使用恒定的额外空间。我知道它远不及,但我的想法是跟踪前一个节点并检查重复并在最后返回数数。但是在执行 顺序 BST 遍历时,我无法返回 integer 值。 除此之外,还有更好的方法来计算 BST 中的重复项。我发起;

inorder(a, a, 0);

【问题讨论】:

  • 大概将遍历结果存储在向量中,如果不需要就地做的话,在向量中查找重复项?
  • @taocp 我刚刚编辑了这个问题。感谢您的提示!
  • 您是否计算多次重复(即,如果您的树中有 三个 6 值,是否打算将其视为“具有重复的单个值”还是应该将其视为两个“重复”(实际上 三个,这是一个更难解决的问题)?
  • 为什么您的 BST 允许重复?
  • @Ali 我编辑了您的问题以使用恒定的额外空间,这是您想要的正确术语

标签: c++ algorithm recursion binary-search-tree traversal


【解决方案1】:

在二叉搜索树中,根据插入的写入方式,重复项将始终位于左侧或右侧,在您的情况下看起来像左侧。因此,您只需要一个额外的变量来跟踪欺骗的计数,如果当前节点与上次访问的节点相同,则在您的函数中跟踪上次访问的节点增加计数。

这是一些代码免责声明:完全未经测试,只知道它可以编译

int count_dupes(Node * root, Node * last = nullptr) {
    int is_dupe = 0;
    if (root->value == last->value) is_dupe = 1;
    return is_dupe + (root->right != nullptr? count_dupes(root->right,root):0)
        + (root->left!= nullptr? count_dupes(root->left,root):0);
}

顺便说一句,我觉得这是一个面试类型的问题,但 Thomas Matthews 是对的,你的树不应该插入重复的。

【讨论】:

  • 要么那个,要么一个家庭作业。可能是作业,所以我选择不提供代码:)
  • @AlexK 我什至不知道它是否有效,我只知道它可以编译
  • @AlexK 我也是 30 分钟前回答的,没有紫外线所以我想我会发布一些代码
  • 我想在第 2 行比较 root->value == last->value,当最后一个作为 nullptr 发送时会导致 seg 错误...
【解决方案2】:

让我们假设在您的 BST 中,重复项只能在节点的左侧(它始终是同一侧,我们只需要选择约定并坚持下去)。只需在按顺序遍历中左递归时增加重复计数,并且值不会改变。确保通过引用而不是值传递计数。在开始之前将其归零。很好的面试问题,顺便说一句

【讨论】:

  • OP 再也没有回来
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-29
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
  • 2012-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多