Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
前言
力扣第112题 路径总和
如下所示:
给你二叉树的根节点 root
和一个表示目标和的整数 targetSum
。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum
。如果存在,返回 true
;否则,返回 false
。
叶子节点 是指没有子节点的节点。
示例 1:
输入: root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出: true
解释: 等于目标和的根节点到叶节点路径如上图所示。
示例 2:
输入: root = [1,2,3], targetSum = 5
输出: false
解释: 树中存在两条根节点到叶子节点的路径:
(1 --> 2): 和为 3
(1 --> 3): 和为 4
不存在 sum = 5 的根节点到叶子节点的路径。
一、思路
这一题与上一题非常的类似,都是与数中的叶子节点相关。
我的思路也是非常简单的,总共就分为两个步骤:
- 通过递归,找到所有从根节点出发到叶子节点路径上的和
- 遍历所有路径和的列表,如果有目标值则返回
true
,反之返回false
后面我提交的时候发现击败率只有 20%
左右,我就看了一下官方的题解。发现可以在递归的过程中,直接判断 根节点到叶子节点的路径和是否满足条件,只要在递归的过程中出现了一条满足条件的路径,则提前结束遍历。
不难看出官方题解的方式确实是又快又好,代码步骤很少,简单易懂。但既然是以学习为目的,我在这里也详细描述一下我的思路。
图解算法
我们还是以下图的树作为例子,目标值 target
为 38
1. 找到所有根节点到叶子节点的路径和,总共有三条如下所示:
第一条:3 -> 9 -> 1
路径和为 13
第二条:3 -> 20 -> 15
路径和为 38
第三条:3 -> 20 -> 7
路径和为 30
2. 遍历路径和的列表,看是否有目标值 38
很显然列表中包含了目标值 38
,故直接返回 true
即可。
二、实现
实现代码
实现代码与思路中保持一致,但是有一点长。
public boolean hasPathSum(TreeNode root, int targetSum) {
List<Integer> ret = new ArrayList<>();
allNodePathRet(ret, root, 0);
for (int val : ret){
if (val == targetSum)
return true;
}
return false;
}
/**
* 找到所有路径和
*/
public void allNodePathRet(List<Integer> list, TreeNode root, int pathVal){
if (root == null)
return;
pathVal += root.val; // 加上当前节点的值
if (root.left == null && root.right == null){ // 叶子节点
list.add(pathVal);
}
if (root.left != null){
allNodePathRet(list, root.left, pathVal);
}
if (root.right != null){
allNodePathRet(list, root.right, pathVal);
}
}
测试代码
public static void main(String[] args) {
TreeNode treeNode = new TreeNode(1, new TreeNode(2), null);
new Number112().hasPathSum(treeNode, 1);
}
结果
三、总结
感谢看到最后,非常荣幸能够帮助到你~♥
如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~