【发布时间】:2022-01-06 10:10:38
【问题描述】:
我使用下面的 C++ 代码为多集实现了 BST,而每个节点包含每个不同数字 data 的出现次数 num,我尝试找到小于某个值 x 的元素数,使用下面的order 函数。
但是,它在执行时间方面效率低下。 有没有时间复杂度更好的方法?
struct Node {
int data;
int height;
int num;
Node *left;
Node *right;
};
int order(Node *n, int x) {
int sum = 0;
if (n != NULL) {
if (n->data < x) {
sum += n->num;
sum += order(n->right, x);
}
sum += order(n->left, x);
}
return sum;
}
【问题讨论】:
-
什么是 Node::num?
-
那个数(数据)出现的次数,比如2出现一次,代表它的节点就会有data=2和num=1
-
一般来说,递归函数并不是最有效的。观察有多少相同的
int x副本。 -
另一个观察 - 如果
Node有一个“父”指针,您可以遍历整个树而不需要任何堆栈。 -
我认为你不能走得更快,除非你在每个节点中存储更多数据(但插入会花费更长的时间)。例如。每个节点可以包含以它为根的整个子树中的值的总数。然后对于
n->data < x,您已经准备好答案,并且只需要在n->data >= x时检查左子树。这将成为尾递归,并且可以转换为迭代。
标签: c++ c++11 search binary-search-tree