所以我正在开发一个方法来获取二进制搜索树中的节点数,当我有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
}
}
答案 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());
}