之前做过257. 二叉树的所有路径,最直接的想法就是在这个基础上改一改。
先把找所有路径的代码撸出来:
public static List<List<TreeNode>> binaryTreePaths(TreeNode root) {
List<List<TreeNode>> res = new ArrayList<>();
if (root == null){
return res;
}
List<TreeNode> path = new ArrayList<>();
path.add(root);
travel(root, res, path);
return res;
}
private static void travel(TreeNode root, List<List<TreeNode>> res, List<TreeNode> path){
if (root.left==null&&root.right==null){
List<TreeNode> tmp = Arrays.asList(new TreeNode[path.size()]);
Collections.copy(tmp, path);
res.add(tmp);
}
if (root.left!=null){
path.add(root.left);
travel(root.left, res, path);
path.remove(path.size()-1);//回溯
}
if (root.right!=null){
path.add(root.right);
travel(root.right, res, path);
path.remove(path.size()-1);//回溯
}
}
改一改:
public boolean hasPathSum(TreeNode root, int targetSum) {
List<List<TreeNode>> res = new ArrayList<>();
if (root == null){
return false;
}
List<TreeNode> path = new ArrayList<>();
path.add(root);
travel(root, res, path);
boolean flag = false;
for( List<TreeNode> item: res){
int sum = 0;
for (TreeNode node:item){
sum += node.val;
}
if (sum==targetSum){
flag = true;
return flag;
}
}
return flag;
}
private void travel(TreeNode root, List<List<TreeNode>> res, List<TreeNode> path){
if (root.left==null&&root.right==null){
List<TreeNode> tmp = Arrays.asList(new TreeNode[path.size()]);
Collections.copy(tmp, path);
res.add(tmp);
}
if (root.left!=null){
path.add(root.left);
travel(root.left, res, path);
path.remove(path.size()-1);
}
if (root.right!=null){
path.add(root.right);
travel(root.right, res, path);
path.remove(path.size()-1);
}
}
更简单的方法:
public boolean haspathsum2(TreeNode root, int targetsum) {
if (root == null) return false; // 为空退出
// 叶子节点判断是否符合
if (root.left == null && root.right == null) return root.val == targetsum;
// 求两侧分支的路径和
return haspathsum2(root.left, targetsum - root.val) || haspathsum2(root.right, targetsum - root.val);
}