Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:在BST中计算重复项_C++_Algorithm_Recursion_Binary Search Tree_Traversal - Fatal编程技术网

C++ C++;:在BST中计算重复项

C++ C++;:在BST中计算重复项,c++,algorithm,recursion,binary-search-tree,traversal,C++,Algorithm,Recursion,Binary Search Tree,Traversal,我有一个BST as 我有以下代码来计算重复计数,这里应该是1(6有一个重复) 在二元搜索树中,根据插入的编写方式,副本将始终位于左侧或右侧,在您的案例中看起来像左侧。因此,您只需要一个额外的变量来跟踪重复的计数,如果当前节点与上次访问的节点相同,则在函数中跟踪上次访问的节点,增加一个计数 这里有一些代码免责声明:完全未经测试,只需知道它是编译的 int count_dupes(Node * root, Node * last = nullptr) { int is_dupe = 0;

我有一个BST as

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


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

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

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中,重复项只能位于节点的左侧(它总是在同一侧,我们只需要选择约定并坚持它)。只要在遍历顺序中向左递归时增加重复计数,值就不会改变。确保通过引用而不是通过值传递计数。在开始之前把它调零。很好的面试问题,顺便说一句

可能将遍历结果存储在向量中,然后在向量中查找重复项(如果不需要执行此操作)?@taocp我刚刚编辑了问题。谢谢你的提示!您是否没有计算多个重复项(即,如果您的树中有三个
6
值,它是打算被视为“具有重复项的单个值”还是应该被视为两个“重复项”(实际上是三个,这是一个更难解决的问题)?为什么你的BST允许重复?@Ali我将你的问题编辑为使用恒定的额外空间,这是正确的术语,用于描述你想要的内容或家庭作业。可能是家庭作业,所以我选择不提供代码:)@AlexK我甚至不知道它是否有效我只知道它compiles@AlexK另外,我在30分钟前回答了,没有UV,所以我想我会发布一些代码,我想比较第2行的root->value==last->value,当last是一个发送进来的null时,ptr会导致seg故障……OP永远不会回来
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);
    }
}
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);
}