437. 路径总和 III

Posted Debroon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了437. 路径总和 III相关的知识,希望对你有一定的参考价值。

437. 路径总和 III

 


题目

传送门:https://leetcode.cn/problems/path-sum-iii/


 


算法设计:深度优先搜索

枚举每个节点和TA的子节点,看能不能组成路径和。

class Solution 
public:
    int ans=0;
    int pathSum(TreeNode* root, int sum) 
        if(root) 
            dfs(root, sum);                   // 以当前节点为父节点,对下面的每个子节点进行枚举,看能不能形成路径和
            pathSum(root->left, sum);         // 以当前节点下面的左子节点为父节点尝试
            pathSum(root->right, sum);        // 以当前节点下面的右子节点为父节点尝试
        
        return ans;
    
    
    void dfs(TreeNode* root, long sum)      // 枚举当前父节点和TA子节点的值,看能不能组成路径和
        if(!root) return;
        if(root->val==sum) ans++;            // 当前节点 == sum,答案+1
        dfs(root->left, sum - root->val);    // 遍历左子树,sum = sum - 当前节点值
        dfs(root->right, sum - root->val);   // 遍历右子树,sum = sum - 当前节点值
    
;

可优化一下,使用前缀和。

把二叉树看做是数组,利用前后序遍历来维护前缀和。

class Solution 
public:
    unordered_map<long, int> map;
    int count = 0;
    
    void countPathSum(TreeNode* root, int target, long sum)
        if(!root)
            return;
        sum += root->val;        
        if(sum == target)
            count++;
        if(map.find(sum - target) != map.end())         
        // 检查从根到当前节点的路径中是否存在目标和路径
            count += map[sum - target];
            
        map[sum]++;
        countPathSum(root->left, target, sum);
        countPathSum(root->right, target, sum);
        map[sum]--;      
    
    
    int pathSum(TreeNode* root, int targetSum) 
        countPathSum(root, targetSum, 0);
        return count;
    
;

以上是关于437. 路径总和 III的主要内容,如果未能解决你的问题,请参考以下文章

437. 路径总和 III

437. 路径总和 III

力扣437.路径总和III

LeetCode-437. 路径总和 III

LeetCode437. 路径总和 III

题目地址(437. 路径总和 III)