437. 路径总和 III

给定一个二叉树,它的每个结点都存放着一个整数值。

找出路径和等于给定数值的路径总数。

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

二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。

示例:

root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8

      10
/ \
5 -3
/ \ \
3 2 11
/ \ \
3 -2 1

返回 3。和等于 8 的路径有:

  1. 5 -> 3
  2. 5 -> 2 -> 1
  3. -3 -> 11

双重递归

/*
思路:
1.dfs是求从根节点出发到叶子节点满足条件的路径总数
2.将给定的二叉树看成三个部分:根节点、左子树、右子树
3.三部分可以看成一个递归结构,先求从根节点出发满足条件的路径总数(dfs(root)),
再递归求左子树(pathSum(root.left)),递归求右子树(pathSum(root.right)) 总结:
1.双重递归,从全局找外层递归(如思路中的三个部分),再从部分中找内层递归(如思路中的dfs)
*/ class Solution {
private int count = 0; //存放结果
public int pathSum(TreeNode root, int sum) {
if(root == null) return 0;
dfs(root, sum); //求从根节点出发满足条件的路径总数
pathSum(root.left, sum); //递归求左子树
pathSum(root.right, sum); //递归求右子树
return count;
} private void dfs(TreeNode root, int sum){
if(root == null) return;
sum -= root.val;
if(sum == 0) count++; //满足条件结果加一
dfs(root.left, sum); //继续往左子树找
dfs(root.right, sum); //继续往右子树找
}
}

单重递归

/*
思路:
1.用双重递归会重复计算很多次,其实我们只用单递归就可以解决,
不妨将已经走过的路径值保存到book数组
2.到i节点,就可以根据book倒序遍历,找到从i节点到根节点满足条件的路径总数
3.递归到最底层也就是叶子节点时,找出叶子节点到根节点的满足条件的路径总数之后,
需要将book数组回溯到上一层的状态,以便从上一层继续寻找 总结:
1.将已经求出的值保存,当下次递归时可以直接使用,
省去了重复计算浪费的时间,相当于用空间换取时间
2.递归返回到上层时,我们有时需要原来上层递归的状态,这时就需要用到回溯
*/ class Solution { private int count = 0; //存放结果
public int pathSum(TreeNode root, int sum) {
dfs(root, sum, new ArrayList<Integer>());
return count;
} private void dfs(TreeNode root, int sum, ArrayList<Integer> book){
if(root == null) return; book.add(root.val); //加入当前节点的值
int cur_sum = 0;
for(int i = book.size() - 1; i >= 0; i--){ //从当前节点往根节点寻找满足条件的路径总数
cur_sum += book.get(i);
if(cur_sum == sum) count++;
} dfs(root.left, sum, book); //递归求左子树
dfs(root.right, sum, book); //递归求右子树 book.remove(book.size() - 1); //回溯到上一次的状态,以便继续寻找
}
}

【LeetCode】437. 路径总和 III的更多相关文章

  1. Java实现 LeetCode 437 路径总和 III(三)

    437. 路径总和 III 给定一个二叉树,它的每个结点都存放着一个整数值. 找出路径和等于给定数值的路径总数. 路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点 ...

  2. Leetcode 437.路径总和III

    路径总和III 给定一个二叉树,它的每个结点都存放着一个整数值. 找出路径和等于给定数值的路径总数. 路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点). ...

  3. [LeetCode] 437. 路径总和 III ☆☆☆(递归)

    路径总和 III 描述 给定一个二叉树,它的每个结点都存放着一个整数值. 找出路径和等于给定数值的路径总数. 路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子 ...

  4. leetcode 437. 路径总和 III

    题目描述: 给定一个二叉树,它的每个结点都存放着一个整数值. 找出路径和等于给定数值的路径总数. 路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点). 二 ...

  5. 437. 路径总和 III

    方法一:48 ms /* sumUp递归子程序求解以root为根节点的子节点之和为sum的路径数目; pathSum递归部分是把根节点逐一考察,如以root->left,以root->ri ...

  6. 437路径总和III

    题目: 给定一个二叉树,它的每个结点都存放着一个整数值.找出路径和等于给定数值的路径总数.路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点).来源: ht ...

  7. LeetCode 112. 路径总和(Path Sum) 10

    112. 路径总和 112. Path Sum 题目描述 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和. 说明: 叶子节点是指没有子节点的节 ...

  8. [二叉树-根到叶的子路径]路径总和 III (两层递归)

    题目437. 路径总和 III 给定一个二叉树,它的每个结点都存放着一个整数值. 找出路径和等于给定数值的路径总数. 路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父 ...

  9. LeetCode:路径总和II【113】

    LeetCode:路径总和II[113] 题目描述 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径. 说明: 叶子节点是指没有子节点的节点. 示例:给定如下二叉树, ...

随机推荐

  1. jwt认证生成后的token后端解析

    一.首先前端发送token token所在的位置headers {'authorization':token的值',Content-Type':application/json} 在ajax写 //只 ...

  2. CAD简易口诀,保你一天就记住!零基础也能轻松学!CAD制图宝典!

    如何才能快速的学习CAD制图呢?不仅仅需要多练习,CAD口诀也是不能错过的哦!实用干货这一个就够了快点收藏起来! 1.创建直线的快捷方式是L+空格 2.创建圆的快捷方式是C+空格 3.创建圆弧的快捷方 ...

  3. netcore3.0使用Session

    首先需要明确一点,netcore使用session不能直接使用,必须引用nuget包并做注册之后才能使用. 例如下面的例子,若未注册session服务会报 HttpContext.Session.Se ...

  4. JS中的call,apply和bind及记忆方式

    总结 call().apply()和bind()都是用来改变函数执行时的上下文,可借助它们实现继承:call()和apply()唯一区别是参数不一样,call()是apply()的语法糖:bind() ...

  5. PyCharm将选中的内容加上引号

    正常情况下,选中一段内容,再按引号,内容会被替换为引号 想要将选中的内容不被替换为引号,而在内容的两端加上引号,只需设置一下即可 File  -->  Settings  -->  Edi ...

  6. 文件操作NIO

    在丑陋的 Java I/O 编程方式诞生多年以后,Java终于简化了文件读写的基本操作. 两个基本组件 文件或者目录的路径: 文件本身. 这块基本都是些记忆性的东西,没什么过多的需要写的地方,用的时候 ...

  7. python 1 默写用递归实现无限极分类 2 默写用树实现无限极分类

    data=[ {"cat_id":3,"name":"沙河","parent_id":1}, {"cat_id ...

  8. poj 3233 矩阵快速幂

    地址 http://poj.org/problem?id=3233 大意是n维数组 最多k次方  结果模m的相加和是多少 Given a n × n matrix A and a positive i ...

  9. 使用docker运行springboot项目

    本文主要讲的是使用docker运行springboot项目 获取一个springboot项目 这里我没有重新构建,用的之前写的一个项目,直接从github上下载下来,地址:https://github ...

  10. VIJOS-P1013 强墙

    JDOJ 1198: VIJOS-P1013 强墙 JDOJ传送门 Description ​ 在一个长宽均为10,入口出口分别为(0,5).(10,5)的房间里,有几堵墙,每堵墙上有两个缺口,求入口 ...