📜  仅使用单个递归函数对总计为给定值x的子树进行计数(1)

📅  最后修改于: 2023-12-03 15:36:12.193000             🧑  作者: Mango

仅使用单个递归函数对总计为给定值x的子树进行计数

在树的结构中,我们经常需要计算满足某种条件的子树数量。如果需要计数的条件是总和为给定值x,则可以使用递归函数来实现。

递归函数设计

考虑到符合条件的子树可以是树的任意节点作为根节点的子树,我们可以设计一个递归函数来对每个节点及其子树进行计算。

该递归函数的参数需要包括当前节点和目标值x,每次递归时计算当前节点及其子树的总和,并将其与目标值x进行比较。如果相等,则计数器加一。

接下来,我们需要将递归求和的结果传递到当前节点的父节点。由于单个函数不能同时返回两种类型的值(计数器和求和结果),我们使用引用传递的方式来返回计数器的值。

因此,递归函数的设计如下所示:

int countSubtrees(TreeNode* root, int x, int& count) {
    if (root == nullptr) {
        return 0; // 当前节点为空,返回0
    }
    int sum = root->val 
              + countSubtrees(root->left, x, count) 
              + countSubtrees(root->right, x, count);
    if (sum == x) {
        count++; // 相等,计数器加一
    }
    return sum; // 返回当前节点及其子树的总和
}
总体思路

使用上述递归函数,我们可以遍历树的所有节点,并计算每个节点及其子树的总和,判断是否符合条件,以此来计算满足条件的子树数量。

在主函数中,我们首先初始化计数器count为0,然后调用递归函数countSubtrees对整棵树进行计算,将计数器的值作为函数的引用传递。

int count(TreeNode* root, int x) {
    int count = 0;
    countSubtrees(root, x, count);
    return count;
}
完整代码

综上,我们可以得到完整的代码如下所示:

int countSubtrees(TreeNode* root, int x, int& count) {
    if (root == nullptr) {
        return 0; // 当前节点为空,返回0
    }
    int sum = root->val 
              + countSubtrees(root->left, x, count) 
              + countSubtrees(root->right, x, count);
    if (sum == x) {
        count++; // 相等,计数器加一
    }
    return sum; // 返回当前节点及其子树的总和
}

int count(TreeNode* root, int x) {
    int count = 0;
    countSubtrees(root, x, count);
    return count;
}
参考链接