【问题标题】:How does this function compute the number of nodes in binary tree此函数如何计算二叉树中的节点数
【发布时间】:2016-07-06 14:19:33
【问题描述】:
我有一个函数,我正在尝试分析它的输出是 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。
你们能帮帮我吗?
【问题讨论】:
标签:
c
recursion
tree
binary-search-tree
【解决方案1】:
语义上取左节点数+1(当前节点)+右节点数。
使用 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 放在中间。
【解决方案2】:
看看叶子节点7。
当func_1以节点7的值被调用时,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;
【解决方案3】:
看看这句话
return func_1(node->left) + 1 + func_1(node->right);
^^^^^
如果一个节点不等于NULL,它会计算自己加上左右子树中相对于该节点的节点数。
所以你会得到一个等于不等于NULL的节点数的结果。