给你二叉树的根节点 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.flag
为true
。
为了方便存储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;
}
}
}