首页 > 其他分享 >437. 路径总和 III

437. 路径总和 III

时间:2023-06-05 16:38:35浏览次数:34  
标签:map target int root sum 437 III 节点 总和




437. 路径总和 III

  • 题目
  • 算法设计:深度优先搜索



 


题目

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

437. 路径总和 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;
    }
};


标签:map,target,int,root,sum,437,III,节点,总和
From: https://blog.51cto.com/u_13937572/6417533

相关文章

  • 代码随想录算法训练营第二十五天|216. 组合总和 III、17. 电话号码的字母组合
    【参考连接】216.组合总和III【注意】1.组合不强调元素之间的顺序。【代码】1classSolution(object):2def__init__(self):3self.res=[]4self.sum_now=05self.path=[]6defcombinationSum3(self,k,n):7......
  • HDU4372(第一类斯特林数)
    题目:CounttheBuildings题意:N座高楼,高度均不同且为1~N中的数,从前向后看能看到F个,从后向前看能看到B个,问有多少种可能的排列数。0<N,F,B<=2000首先我们知道一个结论:n的环排列的个数与n-1个元素的排列的个数相等,因为P(n,n)/n=(n-1)!。可以肯定,无论从最左边还是从最右边看,......
  • 337. 打家劫舍 III
    小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为root。除了root之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警......
  • leetcode 557. Reverse Words in a String III
    Givenastring,youneedtoreversetheorderofcharactersineachwordwithinasentencewhilestillpreservingwhitespaceandinitialwordorder.Example1:Input:"Let'stakeLeetCodecontest"Output:"s'teLekatedoCteeLtsetno......
  • 377. 组合总和 Ⅳ
    给你一个由不同整数组成的数组nums,和一个目标整数target。请你从nums中找出并返回总和为target的元素组合的个数。题目数据保证答案符合32位整数范围。输入:nums=[1,2,3],target=4输出:7解释:所有可能的组合为:(1,1,1,1)(1,1,2)(1,2,1)(1,3)(2,1......
  • echarts堆叠柱状图上方展示两个数据项的总和
        //当月漏项统计排名getIndicatorCurve(data1){echarts.init(document.getElementById('lineOption5')).dispose()//销毁实例//找到容器letmyEcharts=echarts.init(document.getElementById('lineOption5'),......
  • #yyds干货盘点# LeetCode程序员面试金典:路径总和 II
    题目:给你二叉树的根节点root和一个整数目标和targetSum,找出所有从根节点到叶子节点路径总和等于给定目标和的路径。叶子节点是指没有子节点的节点。 示例1:输入:root=[5,4,8,11,null,13,4,7,2,null,null,5,1],targetSum=22输出:[[5,4,11,2],[5,8,4,5]]示例2:输入:root=......
  • 路径总和 leetcode——递归+回溯
    题目leetcode:113代码与解析这道题可以看做leetcode112和leetcode257合体这道题要遍历整棵树,把所有符合条件的路径添加进去,所以不需要返回值递归三部曲:确定参数和返回值要传入当前节点,和总和,不需要返回值确定终止条件如果当前节点没有叶子结点,并且和等于target.那么添加进r......
  • #yyds干货盘点# LeetCode程序员面试金典:路径总和
    题目:给你二叉树的根节点 root和一个表示目标和的整数 targetSum。判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和 targetSum。如果存在,返回true;否则,返回false。叶子节点是指没有子节点的节点。 示例1:输入:root=[5,4,8,11,null,13,4,......
  • 链表应用 III
    目录链表应用应用1:Leetocde.21题目分析代码实现方法一:迭代实现方法一:递归实现应用2:Leetocde.23题目分析方法一:分治方法二:优先级队列代码实现方法一:分治方法二:优先级队列应用3:Leetocde.141题目分析代码实现应用4:Leetocde.142题目分析代码实现应用5:Leetocde.876题目分析代码实现应用......