获取二叉搜索树中的节点数

时间:2013-03-12 21:55:24

标签: c++ tree nodes

所以我正在开发一个方法来获取二进制搜索树中的节点数,当我有3个节点时,它给了我3个,但是如果我做了5它给了我4个,我需要改变什么?

int BinaryTree::size(int count, Node *leaf) const
{
    if(leaf != NULL)//if we are not at a leaf
    {
        size(count + 1, leaf->getLeft());//recurisvly call the function and increment the count
        size(count + 1, leaf->getRight());
    }
    else
    {
        return count;//return the count
    }

}

3 个答案:

答案 0 :(得分:9)

int BinaryTree::size(Node *leaf) const 
{
    if(leaf == NULL) { //This node doesn't exist. Therefore there are no nodes in this 'subtree'
        return 0;
    } else { //Add the size of the left and right trees, then add 1 (which is the current node)
        return size(leaf->getLeft()) + size(leaf->getRight()) + 1;
    }
}

虽然这是一种不同的方法,但我发现阅读比你拥有的更容易。

答案 1 :(得分:3)

其他人已经使用了正确的算法。我只想解释为什么你的算法不起作用。

算法背后的逻辑似乎是:保持运行计数值。如果leaf为null,则它没有子节点,所以如果leaf不为null则返回计数,然后递归子节点。

但这是倒退的。因为你需要通过引用传递你的int,而不是值,然后如果它为null则不递增,如果它不为null则递增,并递归。

所以你最初的想法会有一些修改,但尼克米奇森和箭头有更好的方法。这是你的算法固定,所以它的工作原理:

int BinaryTree::size(Node *leaf, int& count=0) const
{
    if(leaf != NULL)//if we are not at a leaf
    {
        count++;
        size(leaf->getLeft(), count);//recurisvly call the function and increment the count
        size(leaf->getRight(), count);
    }

    return count;//return the count
}

但同样,有更好的方法来写这个。其他答案显示了它们。

答案 2 :(得分:2)

int BinaryTree::size(Node *n) const
{
    if(!n) 
        return 0;
    else
        return size(n->getLeft()) + 1 + size(n->getRight()); 
}