112. 路径总和
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。叶子节点 是指没有子节点的节点。
分析思路
- 只需要用后序遍历对每个节点进行遍历,每次遍历将目标值减去节点值,当遍历到叶子节点时,判断目标值是否为叶子节点的值,若为若为叶子节点的值,则此条路径满足要求,反之不满足
- 判断叶子节点的值是否为遍历后目标值所剩余的值
if(root==null)
{
return false;
}
if (root.right == null && root.left == null && targetSum == root.val) {
return true;
}
if (root.left == null && root.right == null && targetSum != root.val) {
return false;
}
- 对左右节点进行遍历,注意回溯的过程
在这里插入代码片
if(root!=null){
targetSum=targetSum- root.val;
if(root.left!=null&&hasPathSum(root.left,targetSum)){
return true;
}
targetSum=targetSum+root.val;
}
if(root!=null){
targetSum=targetSum- root.val;
if(root.right!=null&&hasPathSum(root.right,targetSum)){
return true;
}
targetSum=targetSum-root.val;
}
- 完整代码如下
在这里插入代码片
public boolean hasPathSum(TreeNode root, int targetSum) {
if(root==null)
{
return false;
}
if (root.right == null && root.left == null && targetSum == root.val) {
return true;
}
if (root.left == null && root.right == null && targetSum != root.val) {
return false;
}
if(root!=null){
targetSum=targetSum- root.val;
if(root.left!=null&&hasPathSum(root.left,targetSum)){
return true;
}
targetSum=targetSum+root.val;
}
if(root!=null){
targetSum=targetSum- root.val;
if(root.right!=null&&hasPathSum(root.right,targetSum)){
return true;
}
targetSum=targetSum-root.val;
}
return false;
}