LeetCode——112 路径总和(JAVA)

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

叶子节点 是指没有子节点的节点。

示例 1:

在这里插入图片描述

输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true

示例 2:

在这里插入图片描述

输入:root = [1,2,3], targetSum = 5
输出:false

示例 3:

输入:root = [1,2], targetSum = 0
输出:false

提示:

  • 树中节点的数目在范围 [0, 5000]
  • -1000 <= Node.val<= 1000
  • -1000 <= targetSum<= 1000

思路

本题的思路很简单,就是用dfs搜索(其实本质上和先序遍历一样),如果遇到叶子结点(即:root.left==null&&root.right==null),就开始判断这一路上的点权总和是否等于targetSum,如果是,则修改传入的cnt.flagtrue

为了方便存储dfs搜索经过的路径,我用了ArrayList来存放每一个点权,这样到达叶子结点时,只需要遍历ArrayList中的所有元素,将它们相加,就是从根到叶子的一条路径和。另外,当dfs退回时,要记得将ArrayList中存储的最后一个结点的点权删除,这样才不会影响第二条路的求和。

代码

public class Solution {
	public static class TreeNode {//为了方便本地调试调用内部类,我写了静态的
		//实际提交时可以不写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 class Count{
		boolean flag;
	}
	ArrayList<Integer> arrayList = new ArrayList<Integer>();
	public void dfs(TreeNode root, int targetSum, Count cnt) {
		arrayList.add(root.val);
		if(root.left==null&&root.right==null) {//如果当前是叶子结点
			int sum = 0;
			for(int i=0;i<arrayList.size();i++) {
				sum += arrayList.get(i);
			}
			if(sum==targetSum) cnt.flag = true;
			return;
		}
		if(root.left!=null) {
			dfs(root.left, targetSum, cnt);
			arrayList.remove(arrayList.size()-1);
		}
		if(root.right!=null) {
			dfs(root.right, targetSum, cnt);
			arrayList.remove(arrayList.size()-1);
		}
	}
	public boolean hasPathSum(TreeNode root, int targetSum) {
		Count cnt = new Count();
		if(root==null) return false;
		else {
			dfs(root, targetSum, cnt);
			return cnt.flag;
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值