首页 > 编程语言 >leetcode算法题 437.路径总和

leetcode算法题 437.路径总和

时间:2024-10-16 18:36:44浏览次数:5  
标签:curr 路径 节点 return 算法 targetSum 437 root leetcode

题目描述

给定一个二叉树的根节点 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

 

提示:

    • 二叉树的节点个数的范围是 [0,1000]
    • -109 <= Node.val <= 109 
    • -1000 <= targetSum <= 1000 

 

题解

方法1:深度优先搜索

穷举所有的可能,我们访问每一个节点 node,检测以 node 为起始节点且向下延深的路径有多少种。我们递归遍历每一个节点的所有可能的路径,然后将这些路径数目加起来即为返回结果。

go代码

 //采用递归遍历二叉树的每个节点,求每个节点的rootsum,然后将每个节点所有求的值进行相加求和返回
func pathSum(root *TreeNode, targetSum int) int {
    
    if root == nil {
        return 0
    }
    //fmt.Println("root: "+strconv.Itoa(root.Val))
    //以当前节点为根节点,获取该节点的rootSum
    sum := rootSum(root, targetSum)
    //递归向下,将当前节点的左孩子节点设为根节点,获取该节点的rootSum
    sum += pathSum(root.Left, targetSum)
    //递归向下,将当前节点的右孩子节点设为根节点,获取该节点的rootSum
    sum += pathSum(root.Right, targetSum)
    return sum
}

//递归搜索,返回从当前节点向下进行深度优先搜索,节点累加等于targetSum的路径数
func rootSum(root *TreeNode, targetSum int) int {
    if root == nil {
        return 0
    }
    if root.Val == targetSum {
        return 1
    }
    fmt.Println("root: "+strconv.Itoa(root.Val)+" targetSum: "+strconv.Itoa(targetSum))
    sum := rootSum(root.Left, targetSum-root.Val)
    sum += rootSum(root.Right, targetSum-root.Val)
    return sum
}

 

方法2: 前缀和

解法一中应该存在许多重复计算。我们定义节点的前缀和为:由根结点到当前结点的路径上所有节点的和。我们利用先序遍历二叉树,记录下根节点 root 到当前节点 p 的路径上除当前节点以外所有节点的前缀和,在已保存的路径前缀和中查找是否存在前缀和刚好等于当前节点到根节点的前缀和 curr 减去 targetSum。

go代码:

func pathSum(root *TreeNode, targetSum int) (ans int) {
    // 定义用于存储前缀和的map,key是和,val指是否存在,val为0,指没有和为key的路径,val为1指有和为key的路径
    preSum := map[int64]int{0: 1}
    // 定义匿名函数
    var dfs func(*TreeNode, int64)
    // 用于递归遍历所有节点,并计算每个节点到根节点之间,和为targetSum的路径总数
    dfs = func(node *TreeNode, curr int64) {
        if node == nil {
            return
        }
        //计算根节点到当前节点的路径总和curr
        curr += int64(node.Val)
        // 获取在记录路径前缀和的map中,路径和为curr-targetSum的路径总数
        // 如根节点到pi的路径和为n,n=curr-targetSum,即n+targetSum=curr,那pi+1到当前节点的路径和就是targetSum,那路径和为curr-targetSum,也就是n的路径总数,就是当前节点到根节点之间,和为targetSum的路径总数
        ans += preSum[curr-int64(targetSum)]
        fmt.Print(strconv.Itoa(node.Val)+" ")
        fmt.Print(curr)
        fmt.Println(preSum)
        // 从根节点到当前节点总和为curr的路径数+1
        preSum[curr]++
        dfs(node.Left, curr)
        dfs(node.Right, curr)
        preSum[curr]--
        return
    }
    dfs(root, 0)
    return
}

 

 

标签:curr,路径,节点,return,算法,targetSum,437,root,leetcode
From: https://www.cnblogs.com/l199616j/p/18470407

相关文章

  • 算法iITCGP的数值试验结果
    试验一:试验二: ......
  • 算法-中缀转后缀表达式(C++)
    因为操作数在后缀表达式中它们的顺序与中缀表达式一致,所以操作数不需要进行特殊处理,所以遇到数字就输出,遇到符号就经过处理再输出所以需要用一个存储结构存符号为什么用栈存储:要利用后进先出的特性出栈也就是加入到后缀表达式中,一部分一部分处理,处理完一部分,要处理他邻近的......
  • <Leetcode:算法题及解析>最大子数组和(Javascript版)
    题目描述:给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。本题可以使用Kadane's算法实现,这是一种用于解决最大子数组和问题的高效算法。它由JosephBornKadane在1984年提出。这个算法的核......
  • ssm果蔬销售商城vue 协同过滤算法 echart可视化springboot
    目录项目介绍系统实现截图协同过滤算法B/S架构技术介绍核心代码部分展示论文结构其他springboot项目推荐系统测试详细视频演示果蔬销售商城源码获取项目介绍ssm果蔬销售商城果蔬销售系统—便于商家记录销售情况同时方便消费者购买水果蔬菜的电商平台前台用户模块:......
  • 智能车摄像头开源—1.2核心算法:自适应八向迷宫(下)
    一、前言     本篇将详细讲述自适应八向迷宫的算法原理,优势以及弊端。     同样在此声明:此系列开源均由本人实践和经验得出,并不保证完全正确,仅供参考和入门学习。二、自适应八向迷宫优势具备极快的速度优势,在双核主频200MHz英飞凌TC264主控上,单核运算......
  • C++ 排序算法(选择、冒泡、插入)
    八、选择排序(从小到大): 选择排序的基本思想是:每一趟从待排序的数据中,通过“打擂台”比较选出最小元素,放在这些数据的最前面。这样,第一趟把n个数中(第1个到第n个)最小的放在第一个位置,第二趟把剩余的n-1个数中(第2个到第n个)最小的放在第二个位置,第三趟把剩余的n......
  • 【关联规则挖掘算法‌】基于聚类的关联规则挖掘算法
    目录一、基于聚类的关联规则挖掘算法概述1.1K-Means算法1.2K-Means++算法1.3DBSCAN算法1.4层次聚类算法二、基于聚类的关联规则挖掘算法优缺点和改进2.1  基于聚类的关联规则挖掘算法优点2.2  基于聚类的关联规则挖掘算法缺点2.3  基于聚类的关联规则挖掘算......
  • 算法-二叉树展开单链表
    这道题我们可以利用栈来做,利用栈先进后出的特性每次先加入右节点再加入左节点,这样的话弹出的时候正好左节点在前面,右节点在后面满足题目要求。然后至于是构造单链表,我们可以用一个prev节点prev的left永远都是null而prev的right永远都等于cur 因为每次curr都是栈内弹出来......
  • 代码随想录算法训练营第一天|704二分查找、27移除元素、977有序数组的平方
    代码随想录算法训练营第一天|704二分查找、27移除元素、977有序数组的平方1Leetcode704二分查找题目链接:[704.二分查找](704.二分查找-力扣(LeetCode))文章链接:[代码随想录](代码随想录(programmercarl.com))视频链接:[手把手带你撕出正确的二分法|二分查找法|二分搜......
  • 求最大公公约数(最大公因数)—— 欧几里得算法
    求最大公因数求两数的最大公因数通常的做法是对两个数因式分解,找出共同的素数,然后求出最大公因数(GCD)。但是当数字越大时,因式分解就越困难,此时,使用欧几里得算法就能高效求出其最大公因数。欧几里得算法欧几里得算法(又称辗转相除法)用于计算两个数的最大公因数,被称为是世界上最古......