C++ C++;:在BST中计算重复项
我有一个BST as 我有以下代码来计算重复计数,这里应该是1(6有一个重复)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;
在二元搜索树中,根据插入的编写方式,副本将始终位于左侧或右侧,在您的案例中看起来像左侧。因此,您只需要一个额外的变量来跟踪重复的计数,如果当前节点与上次访问的节点相同,则在函数中跟踪上次访问的节点,增加一个计数 这里有一些代码免责声明:完全未经测试,只需知道它是编译的
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);
}