【问题标题】: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;
    

    【讨论】:

    • 我现在明白了。谢谢2501!
    【解决方案3】:

    看看这句话

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 2019-05-05
      • 2020-08-25
      相关资源
      最近更新 更多