今日心情:🥱🥱 麻了
题目描述:
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。
叶子节点 是指没有子节点的节点。
解题代码:
/**
* 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 static void process(TreeNode x, int preSum, int sum){
if(x.left == null && x.right == null){
if(x.val + preSum == sum){
isSum = true;
}
return;
}
//x 非叶子节点
preSum += x.val;
if(x.left != null){
process(x.left,preSum, sum);
}
if(x.right != null){
process(x.right, preSum, sum);
}
}
public static boolean isSum = false;
public boolean hasPathSum(TreeNode root, int targetSum) {
if(root == null){return false;}
isSum = false;
process(root,0,targetSum);
return isSum;
}
}
解题思路:(来自左神 👉 数据结构与算法视频
)
(1)采用递归思想
(2)首先判断树节点不为空的情况(为空不需要进行递归,直接返回false)
(3)设置一个存在path满足sum == targetsum条件的标志 isSum = false(判断当前path是否满足条件)
(4)递归方法 process 参数: 当前treenode 节点 x , 之前所有节点的值的总和presum,需要达到的目标sum。
1. 首先判断叶子节点处的情况(结束当前递归调用)
x.left == null && x.right == null (叶子节点左右均无节点)
如果该节点是叶子节点,那么presum + x.val (之前所有节点值总和 + 当前节点值 )是否满足targetsum 的要求,如果是则说明存在这样的节点 path 满足这样的sum要求,此时 isSum 设置为 true,否则isSum仍然为false。然后返回 空 return ;(只需要在满足条件下,改变isSum的状态值即可)。
2. 对于非叶子节点的处理
计算presum += x.val (计算presum 直到加到叶子节点为止)
如果当前节点存在左右节点,则进行递归调用,直到叶子节点的判断为止,最终返回。
x.left != null ; x.right != null
(5)在主函数中调用process方法,然后返回isSum的值,如果存在满足sum条件的path,那么isSum的值将从false改变为true。
小结:
感觉递归调用在tree里面用的超级多,难点在于如何根据题目要求,提取出递归调用的方法。