力扣112 路径的总和II
题目:
给你二叉树的根节点 root
和一个表示目标和的整数 targetSum
。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum
。如果存在,返回 true
;否则,返回 false
。
叶子节点 是指没有子节点的节点。
示例 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
解释:树中存在两条根节点到叶子节点的路径:
(1 --> 2): 和为 3
(1 --> 3): 和为 4
不存在 sum = 5 的根节点到叶子节点的路径。
示例 3:
输入:root = [], targetSum = 0
输出:false
解释:由于树是空的,所以不存在根节点到叶子节点的路径。
解题思路:
核心思想就是我们一条路径一条路径每个节点加看现在节点与此路径之前节点和相加是否等于给定地具体的值。采用递归的形式从根节点开始一直到叶子节点结束这才算是一条路径。具体实现代码如下:
代码:
/**
* 路径的总和:在一棵二叉树中寻找是否存在一条路径,这条路径的上节点值的综合为给定的具体某一个值
* 如果存在则返回true如果不存在则返回false
*/
public class HasPathSum {
//1.首先定义一颗二叉树节点类型的类
public static class TreeNode{
public int value;
public TreeNode left;
public TreeNode right;
public TreeNode(int value) {
this.value = value;
}
}
//2.定义一个全局变量isSum是否存在这样的路径
public static boolean isSum = false;
//3.定义一个函数用来处理它是否是存在这样的路径
public static void process(TreeNode x,int preSum,int sum){
//3.1如果x是叶子节点那么就将x节点的值加上前面路径节点值的和preSum看是否等于sum,如果等于就改变全局变量isSum的值
if(x.left == null && x.right == null){
if(x.value + preSum == sum){
isSum = true;
}
return;
}
//3.2如果x是非叶子节点那么首先我们应该先用preSum加上x节点的值再往下进行递归process
preSum+=x.value;
if(x.left != null){
process(x.left,preSum,sum);
}
if (x.right != null) {
process(x.right, preSum, sum);
}
}
//4.根据3判定是否存在一条路径上的和等于给定的具体值
public static boolean hasPathSum(TreeNode root,int sum){
//4.1如果根节点为空那么不存在这样的路径返回false
if (root == null){
return false;
}
//4.2因为isSum是全局变量我们首先将isSum的值设为false
isSum = false;
//4.3从根节点开始调用process函数 根节点开始之前的路径的和preSum为0
process(root,0,sum);
/*
如果从根节点开始调用process()如果存在满足条件的路径那么就会改变isSum的值为true如果不存在就不会改变isSum的值
*/
//4.4最后我们返回isSum
return isSum;
}
}
标签:II,false,路径,public,力扣,isSum,112,null,节点
From: https://www.cnblogs.com/ygstudy/p/17020079.html