Visual c++ BST中的节点计数
我试图计算二叉搜索树中的节点数,我想知道最有效的方法是什么。以下是我发现的选项:Visual c++ BST中的节点计数,visual-c++,binary-search-tree,Visual C++,Binary Search Tree,我试图计算二叉搜索树中的节点数,我想知道最有效的方法是什么。以下是我发现的选项: 在BST类中存储int计数 在存储子节点数的树的每个节点中存储int个子节点 编写一个计算BST中节点数的方法 如果使用选项3,我会写: int InOrder { Node *cur = root; int count = 0; Stack *s = null; bool done = false; while(!done) { if(cur != NUL
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->右侧代码>
那么,哪一个选项最有效?如果是选项3,那么这种方法有效吗?我认为第一个选项是最快的,它只需要O(1)个空间就可以实现。但是,无论何时插入/删除项目,都需要不断更新此值。
获取所有节点的数量需要O(1)个时间
第二个选项将使该程序变得过于复杂,因为在某处删除/插入节点将必须更新其所有祖先。要么添加一个父指针,以便能够充分更新每个祖先,要么需要遍历树中的所有节点并再次更新编号。无论如何,我认为这将是三个选项中最糟糕的一个
第三个选项是好的,如果你不多次调用它,因为第一个选项比这个选项快得多,O(1)。这将需要O(n),因为您需要遍历每个节点来检查计数
就您的代码而言,我认为以如下递归方式编写更容易:
int getCount(Node* n)
{
if (!n)
return 0;
return 1 + getCount(n->left) + getCount(n->right);
}
希望这有帮助