[英]Why does this recursive function counting nodes in a binary search tree always return a result larger than expected?
该函数总是返回一个比实际节点数大 1 的答案(例如,树有 3 个节点,但它返回 4 个)。 我什至尝试在纸上手动执行代码,但仍然没有看到问题。 有没有关于递归或函数的基础知识,我在这里弄错了?
int countNode (Tree &T)
{
int count;
if(T==NULL) return 0;
return count++;
countNode(T->left);
countNode(T->right);
}
这个人给出了一个高出2 分的答案:
int countNode (Tree &T)
{
int count;
if(T==NULL) return 0;
return count+=1;
countNode(T->left);
countNode(T->right);
}
但是,这非常有效:
int countNode (Tree &T)
{
if(T==NULL) return 0;
int a = countNode(T->left);
int b = countNode(T->right);
int count = a + b + 1;
return count;
}
我明白为什么最后一个函数有效,但仍然不知道前两个有什么问题。
您拥有的第一段代码中的问题与其他问题密切相关,因此让我们专注于它。 这是你的代码:
int countNode (Tree &T)
{
int count;
if(T==NULL) return 0;
return count++;
countNode(T->left);
countNode(T->right);
}
这里有几件事情需要注意。 首先,将编译器警告设置调到最大。 您可能会看到几个警告:
您实际上从未初始化过count
的值,因此当您返回count++
,您返回的是一个垃圾值。 这可能解释了为什么您会看到超额计数。
如果你写return count++;
,你是说“增加count
,然后取它的旧值 - 没有增加 - 并返回它。” 这可能不是你想要做的。 如果你想增加count
,只需写count++
。 如果你想返回count
+ 1,就写return count + 1;
.
您编写的return
语句将导致您的函数在进行任何递归调用之前退出 - 对countNode
的调用永远不会到达并且永远不会触发。 您可能希望对代码重新排序或删除使用return
语句编写的代码来解决这个问题。
您永远不会从countNode
捕获返回值。 请记住,对countNode
每次调用都有其自己的count
版本,因此在一次递归调用中简单地增加count
不会触及其他版本的count
。 您需要存储来自两个递归调用的返回值,这应该返回左子树和右子树中的节点数,并弄清楚您希望如何将它们聚合在一起。
我认为编译器警告可能会标记前三个问题,但最后一个更微妙。
基于此,您能否看到另一个不正确的实现中发生了什么,以及为什么您的最后一个实现是正确的?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.