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

How does this function compute the number of nodes in binary tree

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

给定这段代码:

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

这个二叉搜索树:

return 值为 7。

我知道递归,它在这里有点简单,我试着跟进,但我不明白它是如何做到的 returned 7. 我计算它只是向左,向左,然后一次向右,然后而已。这将 return 3。即使它正确地进行了 3 次,在根之后,它仍然是 return 6 而不是 7.

你们能帮帮我吗?

看看叶节点7。

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

然后 func_1 将被调用两次,一次用于左侧 child,一次用于右侧 child。在这两种情况下函数 return 0,因为左和右 child 是 NULL。该函数将 return 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的节点个数的结果。

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

这个原则在递归中用的很频繁:

  • 首先对'current'项(当前节点)进行计算,此时'node itself'的节点数为1。
  • 然后以递归方式添加其他项目的计算,在本例中为当前节点左侧的节点数,以及当前节点右侧的节点数。在这种情况下,出于排序原因,当前节点(节点数)的 +1 放在中间。