该函数如何计算二叉树中的节点数

时间:2016-07-06 14:19:34

标签: c recursion tree binary-search-tree

我有一个函数,我正在尝试分析它的输出是7:

鉴于此代码块:

int func_1(struct node* node)
{
    if (node == NULL)
        return 0;
    else
        return func_1(node->left) + 1 + func_1(node->right);
}

这个二进制搜索树: enter image description here

返回值为7。

我知道递归,这里有点简单,我试着跟进,我无法理解它是如何返回的7.我计算它只是向左,向左,然后一次正确,就是这样。它将返回3.即使它在根之后变为3次,它仍将返回6而不是7。

你们可以帮帮我吗?

3 个答案:

答案 0 :(得分:3)

从语义上讲,它需要左节点数+ 1(当前节点)+右节点数。

with func_1(x)我的意思是在该特定节点上调用该函数。

所以完整的计算是

  • func_1(8)+ 1 + func_1(14)
  • (func_1(7)+ 1 + func_1(9))+ 1 + func_1(14)
  • (1 + 1 + 1)+ 1 +(0 + 1 + func_1(17)
  • 3 + 1 +(0 + 1 +(0 + 1 + func_1(18))
  • 3 + 1 +(1 +(1 +(0 + 1 + 0)
  • 结果为7

此原则在递归中经常使用:

  • 首先计算“当前”项(当前节点),在这种情况下,“节点本身”的节点数为1.
  • 以递归方式添加其他项的计算,在这种情况下是当前节点剩余的节点数,以及当前节点右侧的节点数。出于订购原因,在这种情况下,当前节点的+1(节点数)放在中间。

答案 1 :(得分:1)

看一下叶子节点7.

当使用节点7的值调用func_1时,if语句将分支到else部分,因为指向此节点的指针有效。

然后func_1将为左孩子召唤两次,为右孩子召唤一次。在这两种情况下,函数返回0,因为左和右子项为NULL。该函数将返回1:

return func_1(node->left) + 1 + func_1(node->right);

相当于:

return func_1(NULL) + 1 + func_1(NULL);

变为:

return 0 + 1 + 0;

答案 2 :(得分:0)

看一下这句话

return func_1(node->left) + 1 + func_1(node->right);
                          ^^^^^

如果节点不等于NULL,则它自身加上相对于该节点的左子树和右子树中的节点数。

因此,您将获得的结果等于不等于NULL的节点数。