繁体   English   中英

为什么这个递归函数计算二叉搜索树中的节点总是返回比预期大的结果?

[英]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);
}

这里有几件事情需要注意。 首先,将编译器警告设置调到最大。 您可能会看到几个警告:

  1. 您实际上从未初始化过count的值,因此当您返回count++ ,您返回的是一个垃圾值。 这可能解释了为什么您会看到超额计数。

  2. 如果你写return count++; ,你是说“增加count ,然后取它的旧值 - 没有增加 - 并返回它。” 这可能不是你想要做的。 如果你想增加count ,只需写count++ 如果你想返回count + 1,就写return count + 1; .

  3. 您编写的return语句将导致您的函数在进行任何递归调用之前退出 - 对countNode的调用永远不会到达并且永远不会触发。 您可能希望对代码重新排序或删除使用return语句编写的代码来解决这个问题。

  4. 您永远不会从countNode捕获返回值。 请记住,对countNode每次调用都有其自己的count版本,因此在一次递归调用中简单地增加count不会触及其他版本的count 您需要存储来自两个递归调用的返回值,这应该返回左子树和右子树中的节点数,并弄清楚您希望如何将它们聚合在一起。

我认为编译器警告可能会标记前三个问题,但最后一个更微妙。

基于此,您能否看到另一个不正确的实现中发生了什么,以及为什么您的最后一个实现是正确的?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM