路径总和 III(递归)
给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。
路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
示例 1:

输入:root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8 输出:3 解释:和等于 8 的路径有 3 条,如图所示。
示例 2:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22 输出:3
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: // 计算从当前节点开始的路径中和等于targetSum的个数。 int rootSum(TreeNode* root, long long targetSum) { // 如果当前节点为空,则没有满足条件的路径,返回0。 if (root == nullptr) return 0; int res = 0; // 如果当前节点的值正好等于目标和,则找到一条路径,结果加1。 if (root->val == targetSum) ++res; // 递归计算左子树和右子树中,剩余和(targetSum - 当前节点值)相等的路径数, // 并将这些路径数累加到结果中。 res += rootSum(root->left, targetSum - root->val); res += rootSum(root->right, targetSum - root->val); // 返回以当前节点为根的子树中所有满足条件的路径数。 return res; } // 主函数:计算二叉树中所有和为目标值targetSum的路径数。 int pathSum(TreeNode* root, long long targetSum) { // 如果树为空,则没有满足条件的路径,返回0。 if (root == nullptr) return 0; // 计算从当前节点出发的所有路径中,和为目标值的数量。 int res = rootSum(root, targetSum); // 对于左右子树,分别作为新的根节点,重复上述过程, // 寻找从这些节点出发的所有路径中,和为目标值的数量,并累加到结果中。 res += pathSum(root->left, targetSum); res += pathSum(root->right, targetSum); // 返回整棵树中所有满足条件的路径数量。 return res; } };
浙公网安备 33010602011771号