2016-07-06 66 views
1

我有,我试图分析其输出是一个函数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

从语义上讲,它需要左节点+ 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

这是我的确切解释!清楚并且重点。 – Module

+0

这是完美的! –

+0

为了清楚起见,我添加了一些关于递归的基本原理。 –

1

看看叶节点7

func_1被称为与节点7的值,if语句将跳转到其他部分,因为指针指向此节点是有效的。

然后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; 
+1

我明白了。谢谢2501! –

0

看这个说法

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

如果一个节点不等于NULL它自己加上数字左右子树中相对于该节点的节点。

所以你会得到一个结果,它等于不等于NULL的节点数。