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

C++: Counting the duplicates in a BST

本文关键字:计算 BST C++      更新时间:2023-10-16

我有一个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);

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

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

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);
}

顺便说一句,我感觉这是一个面试类型的问题,但托马斯·马修斯是对的,你的树不应该插入重复的问题。

让我们假设在BST中,重复只能在节点的左侧(它总是在同一侧,我们只需要选择约定并坚持它)。只要在顺序遍历中向左递归时增加重复计数,值就不会改变。确保通过引用而不是通过值传递计数。出发前先把它调零。不错的面试问题,顺便说一句