C ++:计算BST中的重复项

时间:2013-07-24 17:37:01

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

我有 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遍历执行时,我无法返回整数值。 除此之外,还有更好的方法来计算BST中的重复项。我发起;

inorder(a, a, 0);

2 个答案:

答案 0 :(得分: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是对的,你的树不应该插入重复的内容。

答案 1 :(得分:1)

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