题目要求查找是否存在一条路径,这条路径上的所有节点值相加之和等于targetSum
。
基本思路:算出所有路径上的节点值之和curSum并且add到pathSum中,然后再在这些值里面查找是否有targetSum。
注意:
叶子节点 是指没有子节点的节点。
所以递归的出口有两个:
- 当前节点为空,此时return但不向pathSum添加curSum。如:[1, 2]中的1的右节点为空,此时curSum = 1,但是因为1不是叶子节点所以只return不add。
- 当前节点不为空,但是没有子节点,此时curSum加上当前节点值后add并return。
代码如下:
/**
* Definition for a binary tree node.
* public 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;
* }
* }
*/
class Solution {
public boolean hasPathSum(TreeNode root, int targetSum) {
if (root == null)
return false;
List<Integer> pathSum = new ArrayList<>();
calculatePathSum(root, pathSum, 0);
return pathSum.contains(targetSum);
}
public void calculatePathSum(TreeNode cur, List<Integer> pathSum, int curSum){
if (cur == null)
return;
if (cur.left == null && cur.right == null){
curSum += cur.val;
pathSum.add(curSum);
return;
}
curSum += cur.val;
calculatePathSum(cur.left, pathSum, curSum);
calculatePathSum(cur.right, pathSum, curSum);
}
}