【Leetcode-02】 112.路径总和 && 437. 路径总和 III

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);
	}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值