力扣 112. 路径总和

题目说明

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。

叶子节点 是指没有子节点的节点。

提示:

  • 树中节点的数目在范围 [0, 5000]
  • -1000 <= Node.val <= 1000
  • -1000 <= targetSum <= 1000

示例:

示例 1:

img

1
2
输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true

示例 2:

img

1
2
输入:root = [1,2,3], targetSum = 5
输出:false

示例 3:

1
2
输入:root = [1,2], targetSum = 0
输出:false

笔者理解

此题是一道二叉树算法问题,在力扣题库中被定义为简单题。

解法

当笔者阅读完此题后,也采用了递归的方式,不过需要注意的是题目要求的是根节点到叶子节点的路径和,所以一定注意计算时要计算到叶子节点,让我们来看看具体如何实现的吧。

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
/*
* 二叉树
*/
public boolean hasPathSum(TreeNode root, int targetSum) {

if (root == null) {
return false;
}

int num = root.val;

// root.left == null && root.right == null 判断是否到叶子节点
if (root.left == null && root.right == null && targetSum == num) {
return true;
}

// 每次递归试探左右节点是否合适
return hasPathSum(root.left, targetSum - num) ||
hasPathSum(root.right, targetSum - num);
}
}

时间和空间效率还行,可见此解法还比较适合此题。

image-20210911094523311

总结

本题是今天的一题,难度是为简单,感兴趣的朋友都可以去尝试一下,此题还有其他更多的解法,朋友们可以自己逐一尝试。