[每日一题] [力扣 437] [leetcode 437] 路径总和III 2021.9.28

题目描述

给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。

路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

示例 1:
[每日一题] [力扣 437] [leetcode 437] 路径总和III 2021.9.28

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/path-sum-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

关联题目

112 路径总和
113 路径总和II

思路

由于题目中指出路径方向必需是向下的,所以一定是从根节点加上某一个叶子节点的和。
可以从上到下,或者从下到上返回所有可能的和。
需要的节点一定是连续的。

当到达一个节点的时候,可以把此节点与前面所有可能的和加起来。同时再把自己加进去。

有这样一个过程:
比如示例1中的2节点。

if 2 == targetSum:
	sum_count+=1;
2 + 5 = ?
2 + 15 = ?
#计算完之后,把自己插入到历史数据的后面。

#下面计算1节点
if 1 == targetSum:
	sum_count += 1;
1 + 2 = ?
1 + 7 = ?
1 + 17 = ?

尝试1 递归

/**
 * 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:
    int pathSum(TreeNode* root, int targetSum) {
        int sum_count                                         = 0;
        std::function<void(TreeNode *, std::vector<int>)> dfs = [&](TreeNode *node,
                                                                    std::vector<int> his) {
            if (!node)
                return;
            if(node->val == targetSum) {
                sum_count ++;
            }
            for (auto it = his.begin(); it != his.end(); it++) {
                int sum = *it + node->val;
                if (sum == targetSum) {
                    sum_count++;
                }
                *it = sum;
            }
            // push back a new node add from 0 + val.
            his.push_back(node->val);
            dfs(node->left,his);
            dfs(node->right,his);
        };

        dfs(root, std::vector<int>());
        return sum_count;
    }
};
上一篇:437. Path Sum III


下一篇:HttpClient封装工具类