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

我试图计算二叉搜索树中的节点数,我想知道最有效的方法是什么。以下是我发现的选项:

  • 在BST类中存储int计数

  • 在存储子节点数的树的每个节点中存储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->右侧


    那么,哪一个选项最有效?如果是选项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);
    }
    
    希望这有帮助