虽然是个简单题,但是难得能够快速找到思路并顺利求解(hhh),所以写一下分享吧,作为力扣刷题新手,希望和大家交流。
题目描述:
给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。
说明: 叶子节点是指没有子节点的节点。
示例:
给定如下二叉树,以及目标和 sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ \
7 2 1
返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。
题解:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean hasPathSum(TreeNode root, int sum) {
if(root == null)return false;
boolean right = false;
boolean left = false;
sum -= root.val;
if(root.left != null){left = hasPathSum(root.left, sum);}
if(root.right != null){right = hasPathSum(root.right, sum);}
if(sum==0 && root.left == null && root.right == null){return true;}
return left || right;
}
}
思路详解
1.确定迭代的方法
寻找路径总和涉及到树的遍历,所以首先想到使用递归或者迭代。因为hasPathSum(TreeNode root, int sum)方法同样适用于子树,所以就可以直接使用这个方法进行迭代。
2.确定迭代终止条件
终止迭代的条件题目描述里已经说得很清楚了“叶子节点AND求和值匹配”。叶子节点可以描述为root.left==null && root.right==null。求和值sum匹配则可以通过每找到一棵(子)树就用目标sum值减去当前这棵树的val的方法,如果sum==0就说明求和值匹配成功。综合起来,就是sum==0 && root.left == null && root.right == null。
3.如何进行迭代
迭代无非就是在左右子树上继续调用hasPathSum方法,关键是这个方法的返回值该怎么定义。方法的返回值规定为boolean类型,表示符合迭代终止条件即返回true,因为每棵树都有左右两个子树,进而分为两个搜索路径,所以需要用两个boolean类型的变量保存这两个路径上的搜索结果,并将左右子树的搜索结果赋给这两个变量。
boolean right = false;
boolean left = false;
if(root.left != null){left = hasPathSum(root.left, sum);}
if(root.right != null){right = hasPathSum(root.right, sum);}
因为题目要求判断是否存在一条路径,那么就可以用“或”运算左右子树的搜索结果,作为当前树的搜索结果返回。 另外,作为迭代终止条件的叶子节点,因为不存在子树,所以可以直接返回true作为当前树的搜索结果返回。