BST中的节点数

时间:2013-03-16 12:54:58

标签: visual-c++ binary-search-tree

我正在尝试计算二进制搜索树中的节点数,并想知道最有效的方法是什么。这些是我找到的选项:

  1. 在BST类中存储int count

  2. 在树的每个节点中存储int子节点,用于存储其下的子节点数

  3. 编写一个计算BST

  4. 中节点数的方法

    如果使用选项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,那么这个方法会起作用吗?

1 个答案:

答案 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);
}

希望这有帮助!