我正在尝试计算二进制搜索树中的节点数,并想知道最有效的方法是什么。这些是我找到的选项:
在BST类中存储int count
在树的每个节点中存储int子节点,用于存储其下的子节点数
编写一个计算BST
如果使用选项3,我写道:
int InOrder {
Node *cur = root;
int count = 0;
Stack *s = null;
bool done = false;
while(!done) {
if(cur != NULL) {
s.push(cur);
cur = cur->left;
}
else {
if(!s.IsEmpty()) {
cur = s.pop();
count++;
cur = cur->right;
}
else {
done = true;
}
}
}
return count;
}
但是从它看来,它似乎会陷入cur = cur->left;
和cur = cur->right;
那么哪个选项最有效,如果是选项3,那么这个方法会起作用吗?
答案 0 :(得分:0)
我认为第一种选择是最快的,它只需要O(1)空间来实现这一目标。但是,无论何时插入/删除项目,都需要不断更新此值。 获取所有节点的数量需要O(1)时间。
第二个选项会使这个程序过于复杂,因为在某个地方删除/插入一个节点必须更新它的所有祖先。您可以添加父指针,以便可以充分更新每个祖先,或者您需要遍历树中的所有节点并再次更新数字。无论如何,我认为这将是三者中最糟糕的选择。
第三种选择是好的,如果你不多次调用,因为第一个选项比这个选项快很多,O(1)。这将需要O(n),因为您需要遍历每个节点来检查计数。
就您的代码而言,我认为以下面的递归方式编写更容易:
int getCount(Node* n)
{
if (!n)
return 0;
return 1 + getCount(n->left) + getCount(n->right);
}
希望这有帮助!