C 这个函数如何计算二叉树中的节点数

C 这个函数如何计算二叉树中的节点数,c,recursion,tree,binary-search-tree,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); } 这个二叉搜索树: 返回值为7 我知道递归,这里有点简单,我试着跟进,但我不明白它是如何返回7的。我计算过它只是向左,向左,然后向右一次,就是

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

给定此代码块:

int func_1(struct node* node)
{
    if (node == NULL)
        return 0;
    else
        return func_1(node->left) + 1 + func_1(node->right);
}
这个二叉搜索树:

返回值为7

我知道递归,这里有点简单,我试着跟进,但我不明白它是如何返回7的。我计算过它只是向左,向左,然后向右一次,就是这样。它将返回3。即使它向右转3次,在根之后,它仍然返回6,而不是7


你们能帮帮我吗?

看看叶节点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;

看看叶节点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;
看看这句话

return func_1(node->left) + 1 + func_1(node->right);
                          ^^^^^
如果一个节点不等于NULL,它将计算自身加上与该节点相关的左、右子树中的节点数

因此,您将得到一个结果,该结果等于不等于NULL的节点数。

请查看此语句

return func_1(node->left) + 1 + func_1(node->right);
                          ^^^^^
如果一个节点不等于NULL,它将计算自身加上与该节点相关的左、右子树中的节点数


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

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

对于func_1(x),我的意思是在特定节点上调用函数

所以完整的计算是

  • 函数1(8)+1+函数1(14)
  • (func_1(7)+1+func_1(9))+1+func_1(14)
  • (1+1+1)+1+(0+1+函数1(17)
  • 3+1+(0+1+(0+1+函数1(18))
  • 3+1+(1+(1+)(0+1+0)
  • 结果是7
这一原则在递归中经常使用:

  • 首先计算“当前”项(当前节点),在这种情况下,“节点本身”的节点数为1
  • 以递归方式添加其他项的计算,在这种情况下,当前节点的左节点数和当前节点的节点数。出于排序原因,在当前情况下,当前节点(节点数)的+1被放置在中间。

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

对于func_1(x),我的意思是在特定节点上调用函数

所以完整的计算是

  • 函数1(8)+1+函数1(14)
  • (func_1(7)+1+func_1(9))+1+func_1(14)
  • (1+1+1)+1+(0+1+函数1(17)
  • 3+1+(0+1+(0+1+函数1(18))
  • 3+1+(1+(1+)(0+1+0)
  • 结果是7
这一原则在递归中经常使用:

  • 首先计算“当前”项(当前节点),在这种情况下,“节点本身”的节点数为1
  • 以递归方式添加其他项的计算,在这种情况下,当前节点的左节点数和当前节点的节点数。出于排序原因,在当前情况下,当前节点(节点数)的+1被放置在中间。

我现在明白了。谢谢你2501!我现在明白了。谢谢你2501!这将是我的确切解释!清楚且切中要害。为了你的清晰,我添加了一些关于递归的基本原理。这将是我的确切解释!清楚且切中要害。为了你的清晰,我添加了一些关于递归的基本原理。