二叉树:力扣 112.路径总和
题目描述:
给你二叉树的根节点 root
和一个表示目标和的整数 targetSum
。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum
。如果存在,返回 true
;否则,返回 false
。
叶子节点 是指没有子节点的节点。
分析:求路径总和,这里采用递归法。
(一)确定递归函数的参数与返回值
只需找到一个符合条件的路径和,所以需要有返回值,类型为boolean
参数:TreeNode cur 目标和 int targetSum 现在的总和 int sum
(二) 终止条件
//遍历到了叶子节点,如果sum==targetSum,return true,否则 返回false
if(cur.left == null && cur.right ==null){
if(sum == targetSum)
{
return true;
}
else{
return false;
}
}
(三) 单层递归的逻辑
递归的逻辑和回溯的无所谓遍历方式。因为中节点没有处理逻辑。
注意:回溯和递归是一一对应的,有一个递归,就要有一个回溯。回溯要和递归永远在一起,在一个花括号内,不能被分开!之前写的通过部分的案例的代码错在了这里!!!!
单层递归代码:
//左
if(cur.left!=null){
//递归,处理节点
sum+=cur.left.val;
if(PahtSum(cur.left,targetSum,sum)) return true; //递归逻辑
sum-=cur.left.val; //回溯,撤销处理结果
}
//右
if(cur.right!=null){
//递归,处理节点
sum+=cur.right.val;
if(PahtSum(cur.right,targetSum,sum)) return true; //递归逻辑
//回溯,撤销处理结果
sum-=cur.right.val;
}
总体代码:
class Solution {
public boolean hasPathSum(TreeNode root, int targetSum) {
//路径和的话,得用递归法--遍历顺序无所谓.因为中节点没有处理逻辑。
if(root ==null) return false;
//因为没有中的逻辑,所以需要将根节点的值作为sum的初始值
return PahtSum(root,targetSum,root.val);
}
private boolean PahtSum(TreeNode cur,int targetSum,int sum){
//中
//sum+=cur.val;
//确定终止条件--遍历到了叶子节点,如果sum==targetSum,return true,否则 返回false
if(cur.left == null && cur.right ==null){
if(sum == targetSum)
{
return true;
}
else{
return false;
}
}
//左
if(cur.left!=null){
//递归,处理节点
sum+=cur.left.val;
if(PahtSum(cur.left,targetSum,sum)) return true; //递归逻辑
sum-=cur.left.val; //回溯,撤销处理结果
}
//右
if(cur.right!=null){
//递归,处理节点
sum+=cur.right.val;
if(PahtSum(cur.right,targetSum,sum)) return true; //递归逻辑
//回溯,撤销处理结果
sum-=cur.right.val;
}
return false;
}
}