给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。
说明: 叶子节点是指没有子节点的节点。
示例:
给定如下二叉树,以及目标和 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);
}
}
给定一个二叉树,它的每个结点都存放着一个整数值。
找出路径和等于给定数值的路径总数。
路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
二叉树不超过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 的路径有:
来源:力扣(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);
}
}