📅  最后修改于: 2023-12-03 15:36:12.193000             🧑  作者: Mango
在树的结构中,我们经常需要计算满足某种条件的子树数量。如果需要计数的条件是总和为给定值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;
}