112.路径总和

437. 路径总和 III

题目–112.路径总和

给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。

说明: 叶子节点是指没有子节点的节点。

示例:
给定如下二叉树,以及目标和 sum = 22,

5
/ \
4 8
/ / \
11 13 4
/ \ \
7 2 1

返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。

通过次数123,102提交次数241,654

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


思路:

sum==0 并且左子树、右子树都为空时,则说明有满足条件的
如果上述条件其中一项不满足,则需要继续遍历它的左子树和右子树,连接符号用或者,因为只要有一项满足则说明满足条件。

代码:

public boolean hasPathSum(TreeNode root, int sum) {

if(root == null){
return false;
}
sum = sum - root.val;

if(sum == 0 && root.left==null && root.right == null){
return true;
}else{
return hasPathSum(root.left, sum) || hasPathSum(root.right, sum);
}
}

题目–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

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


思路 – 递归!!

首先,最简单的子问题是什么呢?由于这道题是在树的框架下,我们最容易想到的就是遍历的终止条件:

if(root == null){
return 0;
}

接下来,我们来考虑再上升的一个层次,题目要求 路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点) 。这就要求我们只需要去求三部分即可:

  • 以当前节点作为头结点的路径数量
  • 以当前节点的左子树作为头结点的路径数量
  • 以当前节点的右子树作为头结点啊路径数量

最后将这三部分之和作为最后结果即可。

注意:
题解要写两个递归
子递归的作用是 从上往下遍历每一个结点,每条路径,每经过一个结点就用sum的值减去这个结点的数值,如果等于0时,则证明有一条,不等于0时则没有,在这个sum的基础上继续往下遍历,继续减sum的值。 【就算sum的值减为负数了,也不需要重新定义】

public int countPath(TreeNode root, int sum) {

if(root==null){
return 0;
}

sum = sum - root.val;
int res = sum==0?1:0;

return res+countPath(root.left, sum)+countPath(root.right, sum);
}

父递归的作用时,从上往下遍历每一个结点,每个结点都成为一次根结点。

public int pathSum(TreeNode root, int sum) {

if(root == null){
return 0;
}
int res = countPath(root, sum);
int leftCount = pathSum(root.left, sum);
int rightCount = pathSum(root.right, sum);

return res+leftCount+rightCount;
}

代码

public class _02_437路径总和3 {
public static void main(String[] args) {

}

public static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}

public int pathSum(TreeNode root, int sum) {

if(root == null){
return 0;
}
int res = countPath(root, sum);
int leftCount = pathSum(root.left, sum);
int rightCount = pathSum(root.right, sum);

return res+leftCount+rightCount;
}

public int countPath(TreeNode root, int sum) {

if(root==null){
return 0;
}

sum = sum - root.val;
int res = sum==0?1:0;

return res+countPath(root.left, sum)+countPath(root.right, sum);
}

}