C++:计算BST中的重复项
C++: Counting the duplicates in a BST
我有一个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中,重复只能在节点的左侧(它总是在同一侧,我们只需要选择约定并坚持它)。只要在顺序遍历中向左递归时增加重复计数,值就不会改变。确保通过引用而不是通过值传递计数。出发前先把它调零。不错的面试问题,顺便说一句
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 递归函数计算序列中的平方和(并输出过程)
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的字符计数代码计算错误.为什么
- 在计算中使用二的幂有多有利可图
- 如何计算文件中的"columns"数?
- 计算排序向量的向量中唯一值的计数
- 如何使用 std::累积在 C++ 中计算总和立方体
- 使用Qt C++计算类似Git的SHA1哈希
- 如何在BST的这个简单递归实现中消除警告
- OpenCV C++.快速计算混淆矩阵
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- C++如何计算用户输入的数字中的偶数位数
- 如何计算数据类型的范围,例如int
- 类似枚举的计算常量
- 递归函数,用于计算 BST 中具有两个子节点的节点数
- 计算BST返回-1的高度混淆
- 计算 BST 节点移除的时间复杂度
- 如何在 BST (C++) 中迭代计算节点数
- C++:计算BST中的重复项