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